行轉列,列轉行是我們在開發過程中經常碰到的問題。行轉列一般通過CASE WHEN 語句來實現,也可以通過 SQL SERVER 2005 新增的運算符PIVOT來實現。用傳統的方法,比較好理解。層次清晰,而且比較習慣。 但是PIVOT 、UNPIVOT提供的語法比一系列復雜的SELECT...CASE 語句中所指定的語法更簡單、更具可讀性。下面我們通過幾個簡單的例子來介紹一下列轉行、行轉列問題。
我們首先先通過一個老生常談的例子,學生成績表(下面簡化了些)來形象了解下行轉列
CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --學生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成績 ) INSERT INTO [StudentScores] SELECT 'Nick', '語文', 80 INSERT INTO [StudentScores] SELECT 'Nick', '數學', 90 INSERT INTO [StudentScores] SELECT 'Nick', '英語', 70 INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85 INSERT INTO [StudentScores] SELECT 'Kent', '語文', 80 INSERT INTO [StudentScores] SELECT 'Kent', '數學', 90 INSERT INTO [StudentScores] SELECT 'Kent', '英語', 70 INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85
如果我想知道每位學生的每科成績,而且每個學生的全部成績排成一行,這樣方便我查看、統計,導出數據
SELECT UserName, MAX(CASE Subject WHEN '語文' THEN Score ELSE 0 END) AS '語文', MAX(CASE Subject WHEN '數學' THEN Score ELSE 0 END) AS '數學', MAX(CASE Subject WHEN '英語' THEN Score ELSE 0 END) AS '英語', MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物' FROM dbo.[StudentScores] GROUP BY UserName
查詢結果如圖所示,這樣我們就能很清楚的了解每位學生所有的成績了