首頁 >資料庫 >mysql教程 >如何在 SQL Server 中動態透視多個欄位?

如何在 SQL Server 中動態透視多個欄位?

Barbara Streisand
Barbara Streisand原創
2025-01-02 13:46:43744瀏覽

How to Dynamically Pivot Multiple Columns in SQL Server?

SQL Server 中多列的動態透視轉換

概述

本文解決了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn