--★轉換結果如上圖
-創建測試標
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)
--再執行動態語句 (結果如下圖),動態查詢隨表變化