当前位置: 代码迷 >> Sql Server >> 横纵表
  详细解决方案

横纵表

热度:14   发布时间:2016-04-24 09:33:49.0
横纵表求助
Create table tb([No] nvarchar(250),[Name] nvarchar(250),[RefResult] int,[Subject] nvarchar(250),[Result] int)
Insert tb
select N'01',N'张三',75,N'科目1',74 union all
select N'01',N'张三',85,N'科目2',90 union all
select N'01',N'张三',95,N'科目3',93 union all
select N'02',N'李四',75,N'科目1',78 union all
select N'02',N'李四',85,N'科目2',84 union all
select N'02',N'李四',98,N'科目3',100

/*
要求结果
No    Name   科目1   科目1参考   科目1差异       科目2   科目2参考        科目2差异        科目3           科目3参考  科目3差异
01    张三           74        75                  -1                   90              85                        5                   93                   95          -2
02    李四            78       75                   3                   84              85                       -1                 100                   98          2
      合计             152      150                 2                  174             170                     4                  193                  193        0
    */

备注:科目1,科目2,科目3是不确定的哟。
------解决思路----------------------
declare @sql nvarchar(4000)
set @sql=''
Select @sql=@sql+','+[Subject]+'=sum(case when [Subject]='''+[Subject]+''' then [Result] else 0 end)'
+','+[Subject]+'参考=sum(case when [Subject]='''+[Subject]+''' then[RefResult]else 0 end)'
+','+[Subject]+'差异=sum(case when [Subject]='''+[Subject]+''' then [Result]-[RefResult]else 0 end)'
FROM  tb 
group BY [Subject]ORDER BY[Subject]
PRINT @sql
exec('select [No]=isnull([No],''''),[Name]=isnull([Name],N''合计'')'+
@sql+'from tb group by [No],[Name] with rollup
having grouping([No])=1 or grouping([Name])=0
order by grouping([No]),[No]')
  相关解决方案