+ -
当前位置:首页 → 问答吧 → 使用聚合函数能实现这样的查询结果吗?

使用聚合函数能实现这样的查询结果吗?

时间:2011-11-09

来源:互联网

单号 出货日期 书号 书名 进货/退货数量
101001 2011-11-8 978751 语文 50
101001 2011-11-8 978752 数学 20
101001 2011-11-8 978753 英语 15
101002 2011-11-9 978751 语文 -8
101002 2011-11-9 978752 数学 -10
101003 2011-11-9 978751 语文 -5

像这样的数据有很多行,相同品种的进货、退货数量根据书号分别需聚合累加
能实现这样的查询结果吗?

书号 书名 进货 退货 实际发货 发货单号 退货单号
978751 语文 50 -13 37 101001 101002 101003
978752 数学 20 -10 10 101001 101002
978753 英语 15 0 15 101001

作者: smx_21cn   发布时间: 2011-11-09

SQL code
--> --> (Roy)生成測試數據
 
if not object_id('Tempdb..#T') is null
    drop table #T
Go
Create table #T([单号] nvarchar(10),[出货日期] Datetime,[书号] int,[书名] nvarchar(2),[进货/退货数量] int)
Insert #T
select '101001','2011-11-8',978751,N'语文',50 union all
select '101001','2011-11-8',978752,N'数学',20 union all
select '101001','2011-11-8',978753,N'英语',15 union all
select '101002','2011-11-9',978751,N'语文',-8 union all
select '101002','2011-11-9',978752,N'数学',-10 union all
select '101003','2011-11-9',978751,N'语文',-5
Go
Select [书号],[书名],
[进货]=sum(case when [进货/退货数量]>0 then [进货/退货数量] else 0 end),
[退货]=sum(case when [进货/退货数量]<0 then -[进货/退货数量] else 0 end),
[实际发货]=sum([进货/退货数量]),
[发货单号]=ltrim((select ' '+[单号] from #T where [书号]=a.[书号] and [进货/退货数量]>0 for xml path(''))),
[退货单号]=isnull(ltrim((select ' '+[单号] from #T where [书号]=a.[书号] and [进货/退货数量]<0 for xml path(''))),'')
from #T as a
group by [书号],[书名]
order by 1
/*
978751    语文    50    13    37    101001    101002 101003
978752    数学    20    10    10    101001    101002
978753    英语    15    0    15    101001    
*/

作者: roy_88   发布时间: 2011-11-09