SQL多行转多列

技术分享

--★转换结果如上图

1、首先创建表:

CREATE TABLE [成绩表](
[编号] [int]IDENTITY(1,1) NOT NULL,
[姓名] [varchar](50)NULL,
[语文] [numeric](5, 2)NULL,
[数学] [numeric](5, 2)NULL,
[英语] [numeric](5, 2)NULL
) ON [PRIMARY]

2、插入测试数据

INSERT INTO 成绩表([姓名],[语文],[数学],[英语])
VALUES(道一,80,100,90.8),(老二,48,56,60),(张三,88,78,90),(李四,80,90,95),(王五,67,68,56),(刘六,77,68,80)

3、执行语句进行行列转换

declare @sql_1 varchar(8000)
select @sql_1=‘‘
select @sql_1= @sql_1 + select [编号],[姓名],[+name+] AS ‘‘成绩‘‘,‘‘‘+name+‘‘‘ AS ‘‘课程‘‘ from 成绩表 union all 
from syscolumns where id=object_id(成绩表)  and CHARINDEX(name,编号,姓名)=0
select @sql_1= @sql_1 +  select distinct null,null,null,null from 成绩表  
--注意!多一行 selectdistinct null,null,null,null from 成绩表     不加会报union all错误
print @sql_1
declare @sql_2 varchar(8000)
select @sql_2=select [课程] 
select @sql_2=@sql_2 + ,SUM(case when [姓名] = ‘‘‘+[姓名]+‘‘‘ then 成绩 else 0 end) ‘‘‘+[姓名]+‘‘‘ 
from 成绩表
select @sql_2=@sql_2 +  from ( +@sql_1 +) as tb where ISNULL([编号],‘‘‘‘)<>‘‘‘‘ group by [课程]
print @sql_2
execute(@sql_2)

执行行列转换后的结果如图:

技术分享

4、继续添加一些数据

INSERT INTO 成绩表([姓名],[语文],[数学],[英语])
VALUES(鬼七,67,68,56),(王八,77,68,80)

5、继续执行步骤3的脚本,动态查询随表变化,结果如图:

技术分享

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。