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

SQL Server 行轉列 (PIVOT) 實戰技巧:從靜態 CASE 到動態腳本完整示範

     編輯:關於SqlServer

行轉列是報表開發常見需求。本文以「不同時段不同路線的客運量」為例,示範從經典 CASE...SUM 靜態寫法進階到 SQL Server 2005+ 的 PIVOT 動態腳本,並解決相容性等級問題,最後輸出表變量供後續關聯查詢。

源資料與目標格式

原始資料 (行式):時間、路線、客運量

目標格式 (列式):時間、1號線、2號線、5號線...

方法一:經典靜態 CASE 聚合 (通用所有版本)

SELECT 時間,
    SUM(CASE WHEN 路線 = '1號線' THEN 客運量 END) AS '1號線',
    SUM(CASE WHEN 路線 = '2號線' THEN 客運量 END) AS '2號線',
    SUM(CASE WHEN 路線 = '5號線' THEN 客運量 END) AS '5號線'
FROM 來源表
GROUP BY 時間

優點:相容性佳;缺點:路線新增需修改程式碼。

方法二:PIVOT 關鍵字 (SQL Server 2005+)

-- 動態建構 IN 子句
DECLARE @Str NVARCHAR(MAX), @Cols NVARCHAR(MAX);
SELECT @Cols = COALESCE(@Cols + ',', '') + QUOTENAME(路線)
FROM #T GROUP BY 路線;

SET @Str = 'SELECT 時間, ' + @Cols + ' FROM (
    SELECT 時間, 客運量, 路線 FROM #T
) AS src
PIVOT (SUM(客運量) FOR 路線 IN (' + @Cols + ')) AS pvt
ORDER BY 時間';

-- 存入表變量供後續 JOIN
DECLARE @T1 TABLE (時間 DATETIME, [1號線] FLOAT, [2號線] FLOAT, [5號線] FLOAT ...);
INSERT INTO @T1 EXEC (@Str);
SELECT * FROM @T1;

關鍵陷阱:相容性等級

若執行報錯「不支援 PIVOT」,檢查資料庫相容性等級:

EXEC sp_dbcmptlevel '資料庫名', 90  -- 90 = SQL 2005 相容性

進階應用

將轉換後的表變量 @T1 與其他維度表 (如車站資訊、天氣) 關聯,產出完整報表寬表。動態腳本亦可封裝為預存程序,傳入日期範圍參數實現自動化報表產生器。

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