SQL SERVER 多行转多列

 

--★转换结果如上图

 

 

-创建测试标

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]

 

--插入数据(我的是 sqlserver2008 r2)

INSERT INTO 成绩表([姓名],[语文],[数学],[英语])

VALUES('道一',80,100,90.8),('老二',48,56,60),('张三',88,78,90),('李四',80,90,95),('王五',67,68,56),('刘六',77,68,80)

 

-- SELECT * FROM 成绩表

 

--固定转换 查询 (结果如上图)

 

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 distinctnull,null,null,null from 成绩表 ' 

--注意!多一行 selectdistinct null,null,null,null from 成绩表

print @sql_1

--execute(@sql_1)

declare @sql_2 varchar(8000)

select @sql_2='select [课程] '

select @sql_2=@sql_2 + ',SUM(case when [姓名] = '''+[姓名]+''' then 成绩 else 0end) '''+[姓名]+''' '

from 成绩表

select @sql_2=@sql_2 + ' from ( '+@sql_1 +')as tb where ISNULL([编号],'''')<>'''' group by [课程]'

print @sql_2

execute(@sql_2)

 

 

--再插入数据

INSERT INTO 成绩表([姓名],[语文],[数学],[英语])

VALUES('鬼七',67,68,56),('王八',77,68,80)

 

 

--再执行动态语句 (结果如下图),动态查询随表变化


发布了24 篇原创文章 · 获赞 9 · 访问量 19万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章