將「學生-科目-分數」的直式資料轉為「學生-英文-數學」的橫式報表。示範資料表:
Score 表:UID、ScoreName、Score
User 表:ID、Name
SELECT *
FROM (
SELECT UID, Name, Score, ScoreName
FROM Score, [User]
WHERE Score.UID = [User].ID
) AS SourceTable
PIVOT (
AVG(Score) FOR ScoreName IN ([英語], [數學])
) AS PivotTable
適用於欄位固定、已知的情境,語法簡潔。
DECLARE @cols NVARCHAR(4000)
SELECT @cols = ISNULL(@cols + ',', '') + QUOTENAME(ScoreName)
FROM (SELECT DISTINCT ScoreName FROM Score) AS A
DECLARE @sql NVARCHAR(4000)
SET @sql = '
SELECT r.* FROM (
SELECT UID, Name, ScoreName, Score
FROM Score, [User] WHERE Score.UID = [User].ID
) AS t
PIVOT (
MAX(t.Score) FOR t.ScoreName IN (' + @cols + ')
) AS r'
EXEC (@sql)
先動態收集所有科目名稱組成欄位清單,再組裝動態 SQL 執行,適應新增科目無需修改程式碼。
SELECT
ROW_NUMBER() OVER (ORDER BY [User].ID) AS 編號,
UID AS 用戶編號,
Name AS 姓名,
MAX(CASE ScoreName WHEN '英語' THEN Score ELSE 0 END) AS 英語,
MAX(CASE ScoreName WHEN '數學' THEN Score ELSE 0 END) AS 數學
FROM Score, [User]
WHERE Score.UID = [User].ID
GROUP BY UID, [User].ID, Name
使用條件彙總模擬 PIVOT,不依賴 PIVOT 語法,可在舊版 SQL Server 或其他資料庫通用。
