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

SQL Server 動態行轉列 (PIVOT) 完全實戰:參數化表名、分組列、值列的四種實現模式

     編輯:關於SqlServer

核心場景

將「行存儲」的明細數據(如:學生-科目-分數)轉為「列存儲」的寬表(學生-語文-數學-英語),且列名(科目)由數據動態決定。

四種實現模式對比

模式列名來源核心技術優點缺點
靜態 SQL 拼接硬編碼CASE 聚合簡單、無動態 SQL 風險列固定、維護難
動態 SQL 拼接運行時查詢FOR XML PATH + 執行動態 SQL列動態、兼容舊版本注入風險、調試難
靜態 PIVOT硬編碼PIVOT 運算符語法清晰、優化器友好列固定
動態 PIVOT (推薦)運行時查詢PIVOT + 動態列構造標準語法、列動態、性能好需動態 SQL 執行

參數化動態 PIVOT 完整腳本

DECLARE 
    @TableName      SYSNAME = N'TestRows2Columns',
    @GroupCol       SYSNAME = N'UserName',
    @PivotCol       SYSNAME = N'Subject',
    @ValueCol       SYSNAME = N'Source',
    @FilterWhere    NVARCHAR(MAX) = N'';  -- 可選過濾條件

-- 1. 獲取動態列清單
DECLARE @Cols NVARCHAR(MAX);
SELECT @Cols = STRING_AGG(QUOTENAME([Subject]), N',')  -- SQL 2017+
FROM (SELECT DISTINCT [Subject] FROM TestRows2Columns) AS d;
-- 舊版本用 STUFF + FOR XML PATH

-- 2. 構造動態 SQL
DECLARE @SQL NVARCHAR(MAX) = N'
SELECT ' + @GroupCol + N', ' + @Cols + N'
FROM (
    SELECT ' + @GroupCol + N', ' + @PivotCol + N', ' + @ValueCol + N'
    FROM ' + QUOTENAME(@TableName) + N'
    ' + IIF(@FilterWhere = N'', N'', N'WHERE ' + @FilterWhere) + N'
) AS src
PIVOT (
    SUM(' + @ValueCol + N') FOR ' + @PivotCol + N' IN (' + @Cols + N')
) AS pvt;';

-- 3. 執行
EXEC sp_executesql @SQL;

樣本數據與結果

源數據

UserNameSubjectSource
張三語文60
李四數學70
王五英語80
王五數學75

行轉列後

UserName語文數學英語
張三60NULLNULL
李四NULL70NULL
王五577580

行轉列效果圖 樣本數據

進階擴展

  • 多聚合:同科目同時求 SUM、AVG、MAX → 多 PIVOT 聯接或條件聚合
  • 總計行/列:GROUPING SETS / ROLLUP / CUBE
  • SSRS/報表集成:將動態列傳遞給報表矩陣控件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved