首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 動態行轉列 (PIVOT) 實作:學生成績表橫向展開

     編輯:關於SqlServer

需求:將縱向的成績明細表 (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

動態 SQL 實作 (適用科目不固定)


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

SQL Server 2005+ 靜態 PIVOT 寫法 (科目固定)


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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved