Rumah >pangkalan data >tutorial mysql >Bagaimana secara dinamik berputar jadual SQL Server dengan kategori yang berbeza -beza?

Bagaimana secara dinamik berputar jadual SQL Server dengan kategori yang berbeza -beza?

DDD
DDDasal
2025-01-25 18:47:11548semak imbas

How to Dynamically Pivot a SQL Server Table with Varying Categories?

Gunakan SQL dinamik untuk melaksanakan pangsi data

Soalan:

Tukar set data yang mengandungi lajur tarikh, kategori dan amaun kepada jadual pangsi dengan kategori dinamik. Contohnya, data berikut:

<code>日期        类别        金额
2012年1月1日    ABC             1000.00
2012年2月1日    DEF             500.00
2012年2月1日    GHI             800.00
2012年2月10日   DEF             700.00
2012年3月1日    ABC             1100.00</code>

perlu ditukar kepada:

<code>日期        ABC             DEF             GHI
2012年1月1日    1000.00
2012年2月1日                    500.00        800.00
2012年2月10日                   700.00
2012年3月1日    1100.00</code>

Penyelesaian:

SQL Server menyediakan fungsi pangsi dinamik yang boleh digunakan untuk mencapai penukaran ini. Skrip berikut menunjukkan cara melakukannya:

<code class="language-sql">CREATE TABLE temp (
    date DATETIME,
    category VARCHAR(3),
    amount MONEY
);

INSERT INTO temp VALUES ('2012-01-01', 'ABC', 1000.00);
INSERT INTO temp VALUES ('2012-02-01', 'DEF', 500.00);
INSERT INTO temp VALUES ('2012-02-01', 'GHI', 800.00);
INSERT INTO temp VALUES ('2012-02-10', 'DEF', 700.00);
INSERT INTO temp VALUES ('2012-03-01', 'ABC', 1100.00);


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = 'SELECT date, ' + @cols + ' FROM 
            (
                SELECT date, amount, category
                FROM temp
           ) x
            PIVOT 
            (
                 MAX(amount)
                FOR category IN (' + @cols + ')
            ) p ';


EXECUTE(@query);

DROP TABLE temp;</code>

Kaedah ini menggunakan SQL dinamik untuk mendapatkan semula kategori berbeza daripada jadual. Ia kemudian membina klausa PIVOT secara dinamik, dengan mengambil kira semua kategori unik. Hasilnya kemudian dipangsi dengan sewajarnya, menjajarkan data mengikut tarikh dan kategori.

Keputusan:

<code>日期                        ABC         DEF    GHI
2012-01-01 00:00:00.000     1000.00     NULL    NULL
2012-02-01 00:00:00.000     NULL        500.00  800.00
2012-02-10 00:00:00.000     NULL        700.00  NULL
2012-03-01 00:00:00.000     1100.00     NULL    NULL</code>

Atas ialah kandungan terperinci Bagaimana secara dinamik berputar jadual SQL Server dengan kategori yang berbeza -beza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn