CSDN SQL版常見問題之三--列轉行
/*
--轉載請註明,謝謝
--作者: Paoluo
--日期: 2007-08-31
--用途: 將表中的列名轉為Type的資料
*/
--建立測試環境
Create Table TEST
(ID Int,
A Int,
B Int,
C Int)
--插入資料
Insert TEST Select 1, 100, 90, 0
Union All Select 2, 80, 85, 92
Union All Select 3, 87, 0, 0
GO
--測試
--察看原表資料
Select * From TEST
--如果列名已知
--寫出列名已知情況下的語句,是希望能幫助大家更好的理解動態SQL語句
--下面EXEC(@S)中執行即為此語句
Select * From (
Select ID, 'A' As Type, A As Score From TEST
Union
Select ID, 'B' As Type, B As Score From TEST
Union
Select ID, 'C' As Type, C As Score From TEST
) A
Where
Score != 0
Order By
ID, Type
--如果Type不是固定的,使用動態SQL語句
--定義變數
Declare @S Varchar(8000)
--賦初值,此句不能少
Select @S = ''
--從系統表SysColumns中迴圈得到列名(Name),並使用Name拼結語句
Select @S = @S + ' Union Select ID, ''' + Name + ''' As Type, ' + Name + ' As Score From TEST'
From SysColumns Where ID = OBJECT_ID('TEST') Order By ColID
--去掉前面多於的Union, 並去掉為0的Score,加上排序
Select @S = 'Select * From (' + Stuff(@S, 1, 7 ,'') + ' ) A Where Score != 0 Order By ID, Type'
--執行動態SQL語句
EXEC(@S)
GO
--刪除測試環境
Drop Table TEST
--結果
/*
--表中原來資料
ID A B C
1 100 90 0
2 80 85 92
3 87 0 0
--實現效果
ID Type Score
1 A 100
1 B 90
2 A 80
2 B 85
2 C 92
3 A 87
*/