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!