一道笔试题,不知道怎么用纯sql解决
订单order(id,cust_id,create_date...)
订单分单order_entity(id,order_id,prod_id,money)
客户Cust(id,name)
产品prod(id,name)
报表
-------------------------
产品 | 2006.1.1至2007.1.1
---------------------------
| 客户1| 300元
产品1 | ------------------
| 客户2| 200元
-----------------------------
| 客户1| 300元
产品2 | ------------------
| 客户2| 200元
-----------------------------查询语句怎么写?
订单order(id,cust_id,create_date...)
订单分单order_entity(id,order_id,prod_id,money)
客户Cust(id,name)
产品prod(id,name)
报表
-------------------------
产品 | 2006.1.1至2007.1.1
---------------------------
| 客户1| 300元
产品1 | ------------------
| 客户2| 200元
-----------------------------
| 客户1| 300元
产品2 | ------------------
| 客户2| 200元
-----------------------------查询语句怎么写?
SQL的核心价值不是输出好看的报表,是给报表工具提供数据。
这样的面试题目我会做 这样的给他
-------------------------
产品 ¦ 客户 ¦ money
------------------ ----------
产品1 ¦ 客户1 ¦ 300元
------------------ ----------
产品1 ¦ 客户2 ¦ 200元
-----------------------------
产品2 ¦ 客户1 ¦ 300元
------------------ ----------
产品2 ¦ 客户2 ¦ 200元
-----------------------------
再说引用上面的话
用Cursor试试
declare @p0 char(50) SET @p0=''
print '-------------------------'
print '产品 ¦ 2006.1.1至2007.1.1'
declare cur_order cursor for
select dp.name, cu.name, amount = sum[money]
from [order] a
join [order_entity] b on a.id=b.id
join [prod] dp on dp.id=prod_id
join [Cust] dc on dc.id=cust_id
where create_date >= '2006.1.1' and create_date < '2007.1.1'
group by dp.name, cu.name
order by dp.name, cu.name
open cur_order
fetch next from cur_order into @prod, @cust, @amount
while @@fetch_status!=-1 begin
if @p0!=@prod begin
print '------------------------------------------------------------------------'
print @prod+'|'+@cust+'|'+right(space(10)+cast(@amount as varchar(10)),10)+'元'
set @p0=@prod
end
else begin
print space(50)+'|------------------------------------------------------------'
print space(50)+'|'+@cust+'|'+right(space(10)+cast(@amount as varchar(10)),10)+'元'
end
fetch next from cur_order into @prod, @cust, @amount
end
close cur_order
deallocate cur_order
print '------------------------------------------------------------------------'
效果类似于:
-------------------------
产品 ¦ 2006.1.1至2007.1.1
---------------------------
产品1 ¦ 客户1 ¦ 300元
¦------------------
¦ 客户2 ¦ 200元
---------------------------
产品2 ¦ 客户1 ¦ 300元
¦------------------
¦ 客户2 ¦ 200元
---------------------------另: 我还是非常讨厌在SQL中进行输出格式控制
这样回答不知道合适不:
SELECT a.NAME,b.NAME,SUM(d.money) AS TotalCharge
FROM prod a
INNER JOIN Cust b ON a.id = b.id
INNER JOIN order c ON b.id = c.id
INNER JOIN order_Entity d ON c.id = d.id
WHERE c.Create_Date>='2006-1-1' and c.CreateDate<='2007-01-01'
GROUP BY a.NAME,b.NAME
ORDER BY a.NAME,b.NAME
使用报表工具对产品分组,显示上面SQL结果
我也觉得这样的答案已经可以了,不过在招聘笔试中考这样的内容我也觉得不太合适,毕竟工作和考试是两码事,工作可没有闭卷要求,结果这次面试7套卷子,我一半没做到就交卷了,个人感觉很不爽。
呵呵,看来还需要修炼啊。
另外谢谢tim_spac 写出了详细代码