本文解決了Microsoft 中對多列執行動態透視操作的挑戰SQL伺服器.目標是將資料轉換為資料透視表格式,其中行代表指定列中的不同值,列代表其他列中的值。
在執行透視操作之前,資料必須取消透視。此過程透過將多列轉換為行來重塑資料。在這種情況下,Total 和 Volume 欄位將被取消透視。
SELECT ID, CONCAT(T_YEAR, '_', T_TYPE, '_', COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', TOTAL UNION ALL SELECT 'volume', VOLUME ) c (COL, VALUE)
資料取消透視後,就可以建立動態透視查詢。此查詢根據未透視資料動態建立資料透視表所需的列。
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONCAT(T_YEAR, '_', T_TYPE, '_', COL)) FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', 1 UNION ALL SELECT 'volume', 2 ) c (COL, SO) GROUP BY COL, SO, T_TYPE, T_YEAR ORDER BY T_YEAR, T_TYPE, SO FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); SET @query = 'SELECT ID,' + @cols + ' FROM ( SELECT ID, CONCAT(T_YEAR, ''_''+T_TYPE+''_''+COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT ''total'', TOTAL UNION ALL SELECT ''volume'', VOLUME ) c (COL, VALUE) ) x PIVOT ( MAX(VALUE) FOR COL IN (' + @cols + ') ) p ';
動態查詢是使用 sp_executesql 預存程序執行的。此程序會取得動態 SQL 程式碼產生的查詢並執行它。
EXECUTE SP_EXECUTESQL @QUERY;
動態資料透視操作的輸出是一個資料透視表,其行和列具有不同的ID 值表示T_YEAR 和T_TYPE 的每個組合的未透視總和和交易量值。結果如下:
ID | 2008_A_TOTAL | 2008_A_VOLUME | 2008_B_TOTAL | 2008_B_VOLUME | 2008_C_TOTAL | 2008_C_VOLUME | 2009_A_TOTAL | 2009_A_VOLUME | 2009_B_TOTAL | 2009_B_VOLUME | 2009_C_TOTAL | 2009_C_VOLUME |
---|---|---|---|---|---|---|---|---|---|---|---|---|
DD1 | 1000 | 10 | 2000 | 20 | 3000 | 30 | 4000 | 40 | 5000 | 50 | 6000 | 60 |
DD2 | 7000 | 70 | 8000 | 80 | 9000 | 90 | 10000 | 100 | 11000 | 110 | 12000 | 120 |
以上是如何在 SQL Server 中動態透視多個欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!