需求:將縱向的成績明細表 (result) 依科目 (course) 轉為橫向科目欄位的總覽表。
-- 科目表 course
id name
1 國文
2 數學
3 英文
-- 成績表 result
id sid course result
1 2005001 國文 80.0
2 2005001 數學 90.0
3 2005001 英文 80.0
4 2005002 國文 56.0
5 2005002 數學 69.0
6 2005002 英文 89.0
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT sid'
SELECT @sql = @sql + ', ' + QUOTENAME(course.name) + ' = ISNULL(SUM(CASE course WHEN ''' + course.name + ''' THEN result END), 0)'
FROM course
ORDER BY id
SET @sql = @sql + ' FROM result GROUP BY sid ORDER BY sid'
PRINT @sql
EXEC(@sql)
sid 國文 數學 英文
2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0
SELECT sid,
ISNULL([國文], 0) AS 國文,
ISNULL([數學], 0) AS 數學,
ISNULL([英文], 0) AS 英文
FROM (
SELECT sid, course, result FROM result
) src
PIVOT (
SUM(result) FOR course IN ([國文], [數學], [英文])
) pvt
ORDER BY sid
| 特性 | 動態 SQL | 靜態 PIVOT |
|---|---|---|
| 科目數量變動 | 自動適應 | 需修改程式碼 |
| 效能 | 需動態編譯 | 計畫可重用 |
| 可讀性 | 較複雜 | 結構清晰 |
| 適用版本 | 所有版本 | SQL 2005+ |
建議:科目固定用 PIVOT;科目動態或跨資料庫泛用報表用動態 SQL。