使用動態 SQL 實現數據透視
問題:
將包含日期、類別和金額列的數據集轉換為具有動態類別的透視表。例如,以下數據:
<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>
需要轉換為:
<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>
解決方案:
SQL Server 提供了動態透視功能,可以用來實現這種轉換。以下腳本演示瞭如何實現:
<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>
此方法使用動態 SQL 從表中檢索不同的類別。然後,它動態地構造 PIVOT 子句,考慮所有唯一的類別。然後相應地透視結果,按日期和類別對齊數據。
結果:
<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>
以上是如何動態旋轉具有不同類別的SQL Server表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!