sql 合计问题

表T中现有如下数据:
workProc productName departNm amount
裁剪 半袖 裁剪车间 1340
缝纫 半袖 织造车间一部 100
包装 半袖 织造车间二部 100
裁剪 衬衫 裁剪车间 1000
缝纫 衬衫 织造车间三部 150
包装 衬衫 织造车间一部 100
裁剪 裤子 裁剪车间 800
缝纫 裤子 织造车间三部 200
包装 裤子 织造车间四部 120

注:其中workProc列中的已经固定为裁剪、缝纫、包装这三项,其他列都是可变的。现要得到如下结果,还请高手指教。谢谢!

productName workProc 裁剪车间 织造车间一部 织造车间二部 织造车间三部 织造车间四部 合计
半袖 裁剪 1340 1340
半袖 缝纫 100 100
半袖 包装 100 100
衬衫 裁剪 1000 1000
衬衫 缝纫 150 150
衬衫 包装 100 100
裤子 裁剪 800 800
裤子 缝纫 150 150
裤子 包装 120 120
合计 裁剪 3140 3140
合计 缝纫 100 300 400
合计 包装 100 120 220

表格做的不好,还请见谅。我用行变列把departNm列横向了,但是,下面的合计不会了,请指教
create table tb(workProc varchar(20),productName varchar(20),departNm varchar(20),amount int)
insert into tb values('裁剪', '半袖', '裁剪车间' ,1340)
insert into tb values('缝纫', '半袖', '织造车间一部', 100)
insert into tb values('包装', '半袖', '织造车间二部' ,100)
insert into tb values('裁剪', '衬衫', '裁剪车间' ,1000)
insert into tb values('缝纫', '衬衫', '织造车间三部', 150)
insert into tb values('包装', '衬衫', '织造车间一部', 100)
insert into tb values('裁剪', '裤子', '裁剪车间' ,800)
insert into tb values('缝纫', '裤子', '织造车间三部', 200)
insert into tb values('包装', '裤子', '织造车间四部' ,120)
go

declare @sql varchar(8000)
set @sql = 'select isnull(workProc,''合计'') workProc, isnull(productName,''合计'') productName'
select @sql = @sql + ' , max(case departNm when ''' + departNm + ''' then amount else 0 end) [' + departNm + ']'
from (select distinct departNm from tb) as a
set @sql = @sql + ',sum(amount) 合计 from tb group by workProc , productName with rollup'
exec(@sql)
/*
workProc             productName          裁剪车间        织造车间二部      织造车间三部      织造车间四部      织造车间一部      合计         
-------------------- -------------------- ----------- ----------- ----------- ----------- ----------- -----------
包装                   半袖                   0           100         0           0           0           100
包装                   衬衫                   0           0           0           0           100         100
包装                   裤子                   0           0           0           120         0           120
包装                   合计                   0           100         0           120         100         320
裁剪                   半袖                   1340        0           0           0           0           1340
裁剪                   衬衫                   1000        0           0           0           0           1000
裁剪                   裤子                   800         0           0           0           0           800
裁剪                   合计                   1340        0           0           0           0           3140
缝纫                   半袖                   0           0           0           0           100         100
缝纫                   衬衫                   0           0           150         0           0           150
缝纫                   裤子                   0           0           200         0           0           200
缝纫                   合计                   0           0           200         0           100         450
合计                   合计                   1340        100         200         120         100         3910
*/


set @sql = 'select isnull(productName,''合计'') productName , isnull(workProc,''合计'') workProc '
select @sql = @sql + ' , max(case departNm when ''' + departNm + ''' then amount else 0 end) [' + departNm + ']'
from (select distinct departNm from tb) as a
set @sql = @sql + ',sum(amount) 合计 from tb group by productName , workProc with rollup'
exec(@sql)
/*
productName          workProc             裁剪车间        织造车间二部      织造车间三部      织造车间四部      织造车间一部      合计         
-------------------- -------------------- ----------- ----------- ----------- ----------- ----------- -----------
半袖                   包装                   0           100         0           0           0           100
半袖                   裁剪                   1340        0           0           0           0           1340
半袖                   缝纫                   0           0           0           0           100         100
半袖                   合计                   1340        100         0           0           100         1540
衬衫                   包装                   0           0           0           0           100         100
衬衫                   裁剪                   1000        0           0           0           0           1000
衬衫                   缝纫                   0           0           150         0           0           150
衬衫                   合计                   1000        0           150         0           100         1250
裤子                   包装                   0           0           0           120         0           120
裤子                   裁剪                   800         0           0           0           0           800
裤子                   缝纫                   0           0           200         0           0           200
裤子                   合计                   800         0           200         120         0           1120
合计                   合计                   1340        100         200         120         100         3910
*/

drop table tb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值