表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列横向了,但是,下面的合计不会了,请指教

解决方案 »

  1.   

    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)
    godeclare @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