SQL行列转换

列转化成行
-- > --> (Roy)生成測試數據

if not object_id ( ' Class ' ) is null
   
drop table Class
Go
Create table Class( [ Student ] nvarchar ( 2 ), [ Course ] nvarchar ( 2 ), [ Score ] int )
Insert Class
select N ' 张三 ' ,N ' 语文 ' , 78 union all
select N ' 张三 ' ,N ' 数学 ' , 87 union all
select N ' 张三 ' ,N ' 英语 ' , 82 union all
select N ' 张三 ' ,N ' 物理 ' , 90 union all
select N ' 李四 ' ,N ' 语文 ' , 65 union all
select N ' 李四 ' ,N ' 数学 ' , 77 union all
select N ' 李四 ' ,N ' 英语 ' , 65 union all
select N ' 李四 ' ,N ' 物理 ' , 85
Go

动态:

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 + ' 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

/*
Student 数学          物理          英语          语文
------- ----------- ----------- ----------- -----------
李四      77          85          65          65
张三      87          90          82          78

(2 行受影响)
*/



行转化成列
if not object_id ( ' Class ' ) is null
   
drop table Class
Go
Create table Class( [ Student ] nvarchar ( 2 ), [ 数学 ] int , [ 物理 ] int , [ 英语 ] int , [ 语文 ] int )
Insert Class
select N ' 李四 ' , 77 , 85 , 65 , 65 union all
select N ' 张三 ' , 87 , 90 , 82 , 78
Go



动态:

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 Colid
exec ( ' 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

/*
Student Course Score
------- ------- -----------
李四      数学      77
李四      物理      85
李四      英语      65
李四      语文      65
张三      数学      87
张三      物理      90
张三      英语      82
张三      语文      78

(8 行受影响)
*/

你可能感兴趣的:(行列转换)