当前位置: 代码迷 >> Sql Server >> 怎么转置SQL查询结果,用什么语句
  详细解决方案

怎么转置SQL查询结果,用什么语句

热度:101   发布时间:2016-04-25 01:16:14.0
如何转置SQL查询结果,用什么语句?
如select 姓名,科目,成绩 from 成绩表 得到这样的表
姓名 科目 成绩
张1 语文 90
张1 数学 80
张1 英语 95
张2 语文 85
张2 数学 75
张2 英语 90
张3 语文 80
张3 数学 70
张3 英语 50

想通过SQL查询直接得到这样的结果
姓名 语文 数学 英语
张1 90 80 95
张2 85 75 90
张3 80 70 50

各位大侠如何写SQL语句?

------解决方案--------------------
SQL code
--行列互转--摘自中国风博客,引用请标明内容来源--1、行换列if object_id('Class') is not  null    drop table ClassGoCreate table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)Insert Classselect N'张三',N'语文',78 union allselect N'张三',N'数学',87 union allselect N'张三',N'英语',82 union allselect N'张三',N'物理',90 union allselect N'李四',N'语文',65 union allselect N'李四',N'数学',77 union allselect N'李四',N'英语',65 union allselect N'李四',N'物理',85 Go--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]='           +quotename([Course],'''')+' then [Score] else 0 end)'from     Class group by[Course]--select @sexec('select [Student]'+@s+' from Class group by [Student]')--生成静态:select     [Student],    [数学]=max(case when [Course]='数学' then [Score] else 0 end),    [物理]=max(case when [Course]='物理' then [Score] else 0 end),    [英语]=max(case when [Course]='英语' then [Score] else 0 end),    [语文]=max(case when [Course]='语文' then [Score] else 0 end) from     Class group by [Student]GO--动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]select @sexec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')--生成静态:select * from     Class pivot     (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:/*Student 数学         物理         英语         语文------- ----------- ----------- ----------- -----------李四     77          85          65          65张三     87          90          82          78(2 行受影响)*/go--加上总成绩(学科平均分)--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'from Class group by[Course]exec('select [Student]'+@s+',[总成绩]=sum([Score])  from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select     [Student],    [数学]=max(case when [Course]='数学' then [Score] else 0 end),    [物理]=max(case when [Course]='物理' then [Score] else 0 end),    [英语]=max(case when [Course]='英语' then [Score] else 0 end),    [语文]=max(case when [Course]='语文' then [Score] else 0 end),    [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))from     Class group by [Student]go--2005方法:动态:declare @s nvarchar(4000)Select  @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a pivot (max([Score]) for [Course] in('+@s+'))b ')--生成静态:select     [Student],[数学],[物理],[英语],[语文],[总成绩] from     (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])pivot     (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*Student 数学         物理         英语         语文         总成绩------- ----------- ----------- ----------- ----------- -----------李四     77          85          65          65          292张三     87          90          82          78          337(2 行受影响)*/go--2、列转行 if not object_id('Class') is null    drop table ClassGoCreate table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)Insert Classselect N'李四',77,85,65,65 union allselect N'张三',87,90,82,78Go--2000:动态:declare @s nvarchar(4000)select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all+',[Score]='+quotename(Name)+' from Class'from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列order by Colidexec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序生成静态:select * from (select [Student],[Course]='数学',[Score]=[数学] from Class union all select [Student],[Course]='物理',[Score]=[物理] from Class union all select [Student],[Course]='英语',[Score]=[英语] from Class union all select [Student],[Course]='语文',[Score]=[语文] from Class)t order by [Student],[Course]go--2005:动态:declare @s nvarchar(4000)select @s=isnull(@s+',','')+quotename(Name)from syscolumns where ID=object_id('Class') and Name not in('Student') order by Colidexec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')goselect     Student,[Course],[Score] from     Class unpivot     ([Score] for [Course] in([数学],[物理],[英语],[语文]))b生成格式:/*Student Course Score------- ------- -----------李四     数学     77李四     物理     85李四     英语     65李四     语文     65张三     数学     87张三     物理     90张三     英语     82张三     语文     78*/
  相关解决方案