数据统计查询问题(100分)

  • 主题发起人 主题发起人 wqc73
  • 开始时间 开始时间
W

wqc73

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:数据库中有三条数据!大致是第一条是百威卖出2瓶!第二条是百威退回1瓶!第三条是百威送3瓶!
品名 数量 类型(0表示卖出,1表示退回,2表示赠送)
百威 2 0
百威 1 1
百威 3 2

怎么让查询结果变成下面这样在dbgrid里显示出来
品名 卖出 退回 赠送 总数
百威 2 1 3 4
 
select 品名,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 0) as 买出,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 1) as 退出,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 2) as 赠送,
(select Sum(数量) from Table where 品名 = d.品名 and (类型 = 1 or 类型 = 2)) as 总数
from Table
group by 品名

总数不知道对不对啊,你都没说要怎么算总数的。
 
就是卖出的总数 减去 退出的总数 再加上 赠送的总数呀
 
->suger正解帮他补充 一下。
select 品名,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 0) as 买出,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 1) as 退出,
(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 2) as 赠送,
卖出+赠送-退回 as 总数
from Table
group by 品名
 
select 品名,
IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 0), 0) as 买出,
IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 1), 0) as 退出,
ISNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 2), 0) as 赠送,
IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 0), 0)
-IsNull(select Sum(数量) from Table where 品名 = d.品名 and 类型 = 1), 0)
+ IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 2), 0) as 总数
from Table
group by 品名
 
gggoobm的方法是行不通的,这样才行!
这样的速度也肯定也比我刚才的方法快。
select 品名, 买出, 退出, 赠送, 买出 - 退出 + 赠送 as 总数
from (
select 品名,
IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 0), 0) as 买出,
IsNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 1), 0) as 退出,
ISNull((select Sum(数量) from Table where 品名 = d.品名 and 类型 = 2), 0) as 赠送,
from Table
group by 品名
) c
 
学习。
[:)]
 
最合理嘿嘿:
select 品名,
Sum(Case 类型 When 0 then IsNull(数量,0) Else 0 End) as 买出,
Sum(Case 类型 When 1 then IsNull(数量,0) Else 0 End) as 退出,
Sum(Case 类型 When 2 then IsNull(数量,0) Else 0 End) as 赠送,
Sum(Case 类型 When 0 then IsNull(数量,0) Else 0 End)-Sum(Case 类型 When 1 then IsNull(数量,0) Else 0 End)+Sum(Case 类型 When 2 then IsNull(数量,0) Else 0 End) as 总数
from Table
group by 品名
 
dey-999,合理是合理,但要考虑一下速度才行啊。
3条记录的情况下是看不出什么问题来的,
如果是30W行数据我保证你条SQL执行的话最少五分钟,
我最后那条SQL的话最多就30秒!
 
不会吧,你试过?[:)]
 
RE,dey-999的最合理,别人的子查询太多了。
 
多人接受答案了。
 
我测试了一下,30w数据,2s
 
后退
顶部