当前位置: 代码迷 >> Sql Server >> 横纵表,该如何处理
  详细解决方案

横纵表,该如何处理

热度:71   发布时间:2016-04-24 09:39:01.0
横纵表
Create table tb([No] nvarchar(250),[Name] nvarchar(250),[RefResult] int,[Subject] nvarchar(250),[Result] int)
Insert tb
select N'01',N'张三',249,N'科目1',74 union all
select N'01',N'张三',249,N'科目2',83 union all
select N'01',N'张三',249,N'科目3',93 union all
select N'02',N'李四',258,N'科目1',74 union all
select N'02',N'李四',258,N'科目2',84 union all
select N'02',N'李四',258,N'科目3',94

要求结果
/*
No    Name  参考总成绩  科目1   科目2   科目3  总成绩  成绩差异
01    张三            249             74       83        93       250          -1        
02    李四            258             74       84         94      252          6  
      合计              507            148      167      187     502          5
    */

备注:1.每个学生的参考总成绩都是唯一的,比如张三都是249,李四 258
            2.成绩差异=参考总成绩-总成绩
------解决思路----------------------
引用:
可以试一下下面的sql

with cte as (
select [No],[Name],
max([RefResult]) as 参考总成绩,
sum(case when [Subject]='科目1' then [Result] else 0 end) as 科目1,
sum(case when [Subject]='科目2' then [Result] else 0 end) as 科目2,
sum(case when [Subject]='科目3' then [Result] else 0 end) as 科目3,
sum([Result]) as 总成绩,
max([RefResult])-sum([Result]) as 成绩差异
from tb
group by [No],[Name]
)
select isnull(No,''),Name,参考总成绩,科目1,科目2,科目3,总成绩,成绩差异 from (
select * from cte
union all
select null,'合计',SUM(参考总成绩),SUM(科目1),SUM(科目2),SUM(科目3),SUM(总成绩),SUM(成绩差异)
from cte) a
order by isnull(No,'999')

小调一下,忘记给NO取别名了。

with cte as (
select [No],[Name],
max([RefResult]) as 参考总成绩,
sum(case when [Subject]='科目1' then [Result] else 0 end) as 科目1,
sum(case when [Subject]='科目2' then [Result] else 0 end) as 科目2,
sum(case when [Subject]='科目3' then [Result] else 0 end) as 科目3,
sum([Result]) as 总成绩,
max([RefResult])-sum([Result]) as 成绩差异
from tb
group by [No],[Name]
)
select isnull(No,'') as No,Name,参考总成绩,科目1,科目2,科目3,总成绩,成绩差异 from (
select * from cte
union all
select null,'合计',SUM(参考总成绩),SUM(科目1),SUM(科目2),SUM(科目3),SUM(总成绩),SUM(成绩差异)
from cte)a
order by isnull(No,'999')

------解决思路----------------------
declare @sql nvarchar(4000)
set @sql=''
Select @sql=@sql+','+[Subject]+'=sum(case when [Subject]='''+RTRIM([Subject])+''' then [Result] else 0 end)'
FROM  tb 
group BY [Subject],[Sub_no] ORDER BY [Sub_no]
PRINT @sql
exec('select [No]=isnull([No],''''),[Name]=isnull([Name],N''合计'')'+
@sql+',[总成绩]=sum([Result])  from tb group by [No],[Name] with rollup
having grouping([No])=1 or grouping([Name])=0 order by grouping([No]) asc,[总成绩] desc') 
加个order by就可以了
你试下
  相关解决方案