您的位置:首页 > 其它

存储过程记录<二>

2016-11-06 17:17 337 查看
昨天在下班的时候,刚巧无事有一个同事遇到一个数据库查询的问题,然后我就去看看,刚开始的时候没理解他是什么意思,最后问了几遍才明白是什么意思,当然那表结构我也不是很清楚的

今天刚好记录一下,当然那问题虽然解决了但是某些时候需求虽然达到了,但是还是会出现意外,这不仅仅是刚开始的数据库设计的问题,更要紧的是没有把握住客户的需求。我就说说大概的意思:这个报表就是想查询出这个人 消费了物品的数量 和 钱数

select * from Useras
select * from [Order]
select * from OrderDetail


Useras 记录的是这个人购买的记录,当然命名的时候想错了所以就用Useras替代吧。

Order记录的是一个订单的主表

OrderDetail记录的是一个详情表

先插入数据

insert into useras values('张无忌',1)
insert into useras values('张无忌',2)

insert into OrderDetail values(1,'神话笔记本','2','3')
insert into OrderDetail values(1,'天鸟笔记本','4','6')

insert into OrderDetail values(2,'国乒羽毛球','2','3')
insert into OrderDetail values(2,'天鸟羽毛球','4','6')

insert into [Order] values('笔记本系列')
insert into [Order] values('羽毛球系列')




当然,我本来是想用存储过程来写的,但是那个同事代码已经写好了,不想在修改所以我就用了好几遍的查询

我的方法先进行按照人员名字为主键,当然这很不合理最起码应该是CODE的,所以我先写了一部分查询,分别

查询这个人购买的数量,和这个人购买的钱数,然后再以名字作为分组依据(名字会出现重复)

select sum(Quantitys) as Quantitys,Name from (select k.Name,l.Quantitys,Q.Moneys from Useras as K inner join (select sum(Quantity)as Quantitys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as L on k.OrderID=l.OrderID
inner join (select sum(Moneys) as Moneys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as Q on K.OrderID=Q.OrderID) as H group by Name

select sum(Moneys) as Moneys,Name from (select k.Name,l.Quantitys,Q.Moneys from Useras as K inner join (select sum(Quantity)as Quantitys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as L on k.OrderID=l.OrderID
inner join (select sum(Moneys) as Moneys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as Q on K.OrderID=Q.OrderID) as G group by Name




最后的语句:

select HJ.Name,Hk.Quantitys,HL.Moneys from Useras as HJ inner join (select sum(Quantitys) as Quantitys,Name from (select k.Name,l.Quantitys,Q.Moneys from Useras as K inner join (select sum(Quantity)as Quantitys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as L on k.OrderID=l.OrderID
inner join (select sum(Moneys) as Moneys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as Q on K.OrderID=Q.OrderID) as H group by Name) as HK on HJ.Name=HK.Name
inner join (
select sum(Moneys) as Moneys,Name from (select k.Name,l.Quantitys,Q.Moneys from Useras as K inner join (select sum(Quantity)as Quantitys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as L on k.OrderID=l.OrderID
inner join (select sum(Moneys) as Moneys,OrderID from [Order] as b inner join  OrderDetail as c on b.ID=c.OrderID group by OrderID) as Q on K.OrderID=Q.OrderID) as G group by Name) as HL on HJ.Name=Hl.Name group by  HJ.Name,Hk.Quantitys,HL.Moneys




虽然功能完成了,但是这只能查询小批量数据的,如果是大批量数据,这还是不行的。这么多嵌套在一起的查询,肯定是会出问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: