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

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

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 時間
優點:相容性佳;缺點:路線新增需修改程式碼。
-- 動態建構 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 與其他維度表 (如車站資訊、天氣) 關聯,產出完整報表寬表。動態腳本亦可封裝為預存程序,傳入日期範圍參數實現自動化報表產生器。