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

SQL Server 資料行轉列(PIVOT)三種實作方式完整教學

     編輯:關於SqlServer

情境說明

將「學生-科目-分數」的直式資料轉為「學生-英文-數學」的橫式報表。示範資料表:
Score 表:UID、ScoreName、Score
User 表:ID、Name

方法一:靜態 PIVOT(科目固定)

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

適用於欄位固定、已知的情境,語法簡潔。

方法二:動態 PIVOT(科目不固定)

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 執行,適應新增科目無需修改程式碼。

方法三:CASE WHEN 條件彙總(相容性最佳)

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 或其他資料庫通用。

效能與選擇建議

  • 資料量小、欄位固定 → 靜態 PIVOT 可讀性最好。
  • 欄位動態、需自動適應 → 動態 PIVOT。
  • 跨資料庫平台、或需複雜邏輯控制 → CASE WHEN。

Score 表範例資料 User 表範例資料

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