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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章