当前位置: 代码迷 >> Sql Server >> 横纵表排序有关问题
  详细解决方案

横纵表排序有关问题

热度:47   发布时间:2016-04-24 09:47:49.0
横纵表排序问题
假设有张学生成绩表(tb)如下:
No   Name Subject Result
01         张三  1  74
01        张三   2  83
01        张三   3  93
02       李四    1  74
02       李四    2  84
02       李四    3  94

1表示科目编号比如语文;2,表示数学;3表示物理

要求变成
学号   姓名     1           2           3       学生总分  
---------- ----------- ----------- -----------  -----
02      李四    74         84         94         252
01      张三   74         83          93        250
           合计 148       167       187        502
方法如下:
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select No as [学号], Name as [姓名]'
SET @TOTALSQL = ' UNION ALL select '''',''合计'''
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + Subject + ''' then Result else 0 end)'
from (select distinct Subject from tb) as a
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by No,name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
--PRINT @sql
exec(@sql)

但是事实上有可能变成,学科没有进行排序
学号   姓名     1           3          2      学生总分  
---------- ----------- ----------- -----------  -----
02      李四    74          94         84          252
01      张三   74           93          83         250
           合计 148          187      167        502

------解决思路----------------------
你参考下
declare @sql varchar(8000)
DECLARE @TOTALSQL VARCHAR(8000)
set @sql = 'select No as [学号], Name as [姓名]'
SET @TOTALSQL = ' UNION ALL select '''',''合计'''
select @sql = @sql + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end) [' + CAST(Subject AS VARCHAR(10)) + ']'
, @TOTALSQL = @TOTALSQL + ' , sum(case Subject when ''' + CAST(Subject AS VARCHAR(10)) + ''' then Result else 0 end)'
from (select Subject from tb GROUP BY Subject) as a
set @sql = @sql + ' , ISNULL(sum(Result),0)[学生总分] from tb group by No,name '
set @TOTALSQL = @TOTALSQL + ' , ISNULL(sum(Result),0) from tb'
SET @sql=@sql+@TOTALSQL
--PRINT @sql
exec(@sql)
  相关解决方案