库存表中,有产品:
产品款号 属性一 属性二 属性三 属性四 属性五。 数量
A 1a 2b 3b 4a 5d 100
B 1b 2b 3a 4d 5d 220
C 1c 2c 3a 4e 5d 300
D 1b 2d 3d 4e 5c 150就是属性大概有20个。然后我想实现分组统计。按照选择的属性和顺序进行分组统计和小计。
比如选择属性一,二,三,就按照属性一分组汇总,分组的结果再属性二分组汇总,跟选择的属性和顺序有关。该如何写呢。
产品款号 属性一 属性二 属性三 属性四 属性五。 数量
A 1a 2b 3b 4a 5d 100
B 1b 2b 3a 4d 5d 220
C 1c 2c 3a 4e 5d 300
D 1b 2d 3d 4e 5c 150就是属性大概有20个。然后我想实现分组统计。按照选择的属性和顺序进行分组统计和小计。
比如选择属性一,二,三,就按照属性一分组汇总,分组的结果再属性二分组汇总,跟选择的属性和顺序有关。该如何写呢。
declare @sql varchar(8000)
set @sql = '
select
count=sum(数量)
,... -- 在这里拼接传入的属性列表
from theTable
group by
... -- 在这里拼接传入的属性列表
'
exec @sql
select 产品款号,属性一 ,属性二,属性三,数量=sum(数量) from tb
group by 产品款号,属性一 ,属性二,属性三
with rollup
INSERT @t SELECT 'aa','Table','Blue', 124
UNION ALL SELECT 'bb','Table','Red', -23
UNION ALL SELECT 'bb','Cup' ,'Green',-23
UNION ALL SELECT 'aa','Chair','Blue', 101
UNION ALL SELECT 'aa','Chair','Red', -90--统计及排序
SELECT Groups=CASE
WHEN GROUPING(Color)=0 THEN Groups
WHEN GROUPING(Groups)=1 THEN '总计'
ELSE '' END,
Item=CASE
WHEN GROUPING(Color)=0 THEN Item
WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
ELSE '' END,
Color=CASE
WHEN GROUPING(Color)=0 THEN Color
WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
ELSE '' END,
Quantity=SUM(Quantity)
FROM @t
GROUP BY Groups,Item,Color WITH ROLLUP
ORDER BY GROUPING(Groups),
CASE WHEN GROUPING(Groups)=1 THEN '' ELSE Groups END DESC,
GROUPING(Item),
CASE WHEN GROUPING(Item)=1 THEN '' ELSE Item END DESC,
GROUPING(Color),
CASE WHEN GROUPING(Color)=1 THEN '' ELSE Color END DESC,
Quantity DESC
/*--结果
Groups Item Color Quantity
--------- -------------- ----------------------- -----------
bb Table Red -23
Table 小计 -23
bb Cup Green -23
Cup 小计 -23
bb 合计 -46
aa Table Blue 124
Table 小计 124
aa Chair Red -90
aa Chair Blue 101
Chair 小计 11
aa 合计 135
总计 89
--*/
INSERT @t SELECT 'aa','Table','Blue', 124
UNION ALL SELECT 'bb','Table','Red', -23
UNION ALL SELECT 'bb','Cup' ,'Green',-23
UNION ALL SELECT 'aa','Chair','Blue', 101
UNION ALL SELECT 'aa','Chair','Red', -90--汇总显示
SELECT Groups=CASE
WHEN GROUPING(Color)=0 THEN Groups
WHEN GROUPING(Groups)=1 THEN '总计'
ELSE '' END,
Item=CASE
WHEN GROUPING(Color)=0 THEN Item
WHEN GROUPING(Item)=1 AND GROUPING(Groups)=0 THEN Groups+' 合计'
ELSE '' END,
Color=CASE
WHEN GROUPING(Color)=0 THEN Color
WHEN GROUPING(Color)=1 AND GROUPING(Item)=0 THEN Item+' 小计'
ELSE '' END,
Quantity=SUM(Quantity)
FROM @t
GROUP BY Groups,Item,Color WITH ROLLUP
/*--结果
Groups Item Color Quantity
-------- ---------------- ---------------------- -----------
aa Chair Blue 101
aa Chair Red -90
Chair 小计 11
aa Table Blue 124
Table 小计 124
aa 合计 135
bb Cup Green -23
Cup 小计 -23
bb Table Red -23
Table 小计 -23
bb 合计 -46
总计 89
--*/
liangCK 跟我要的结果差不多,我看下语句。to rouqu,是那样子的。还想请大家提醒下,效率上要注意什么,因为这个表里面大概会有几百万行。
就是根据属性个数和顺序进行组合。我再看看。