SQL SERVER中行列转换

 1 DECLARE @subject varchar(2000)
 2 DECLARE @name varchar(2000)
 3 DECLARE @colName varchar(500)  --声明@colName变量,获取列名科目
 4 set @colName = ''
 5 
 6 --INFORMATION_SCHEMA.COLUMNS数据库的表名称,获取表名为A_Table中列名不为name的其他列名,@colName=[Chinese],[Math],[English],[History],[Geography],[Organism],[Chymistry],
 7 SELECT @colName=@colName+'['+COLUMN_NAME+'],' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='A_Table' AND COLUMN_NAME!='name'
 8 
 9 --从表A_Table中获取字段Name的值,@name=[张三],[李四],[王五],[赵六],
10 select @name=LEFT(name,LEN(name)-1) from (select (SELECT '['+Name+'],' FROM A_Table FOR XML PATH('')) as name) as a
11 
12 --@subject=[Chinese],[Math],[English],[History],[Geography],[Organism],[Chymistry]
13 select @subject=subString(@colName,1,len(@colName)-1)
14 
15 --UNPIVOT用于列转行
16 --PIVOT用于将列值旋转为列名(即行转列),语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P
17 exec(
18     '
19     select * from
20     (
21         SELECT name,CAST(kemu as FLOAT) as kemu,科目 
22         FROM A_Table as t
23         unpivot(kemu for 科目 in('+@subject+')) as b
24     ) as a
25     pivot(sum(kemu) for name in('+@name+')) as b
26     '
27 )
28 
29 --原表A_Table
30 select * from A_Table
View Code

 

执行结果如下:

  

转换后格式    
科目张三李四王五赵六
Chinese60708090
Chymistry60708090
English60708090
Geography60708090
History60708090
Math60708090
Organism60708090

 

原表数据格式       
NameChineseMathEnglishHistoryGeographyOrganismChymistry
张三60606060606060
李四70707070707070
王五80808080808080
赵六90909090909090

转载于:https://www.cnblogs.com/hbwy/p/4359209.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值