動態透視:巧妙地將行轉換為列
動態SQL語句是建立彈性查詢的強大工具。本文將重點放在如何在不使用聚合函數的情況下,將行轉換為列。
理解動態透視
透視操作通常使用SUM或MAX等聚合函數。然而,在某些情況下,直接取得值透視是可取的。這需要一種略微不同的方法。
例如,考慮以下來源表:
<code>╔═══════════╦══════╦═══════╗ ║ TEST_NAME ║ SBNO ║ VAL ║ ╠═══════════╬══════╬═══════╣ ║ Test1 ║ 1 ║ 0.304 ║ ║ Test1 ║ 2 ║ 0.31 ║ ║ Test1 ║ 3 ║ 0.306 ║ ║ Test2 ║ 1 ║ 2.3 ║ ║ Test2 ║ 2 ║ 2.5 ║ ║ Test2 ║ 3 ║ 2.4 ║ ║ Test3 ║ 1 ║ PASS ║ ║ Test3 ║ 2 ║ PASS ║ ╚═══════════╩══════╩═══════╝</code>
期望的輸出是一個類似以下的透視表:
<code>╔══════════════════════════╗ ║ SBNO Test1 Test2 Test3 ║ ╠══════════════════════════╣ ║ 1 0.304 2.3 PASS ║ ║ 2 0.31 2.5 PASS ║ ║ 3 0.306 2.4 NULL ║ ╚══════════════════════════╝</code>
無聚合函數的動態透視
為了在不使用聚合函數的情況下實現此結果,我們可以利用PIVOT函數。由於VAL列包含varchar數據,我們可以利用MAX聚合函數。
硬編碼透視
對於數量有限的測試,我們可以如下硬編碼列名:
<code class="language-sql">select sbno, Test1, Test2, Test3 from ( select test_name, sbno, val from yourtable ) d pivot ( max(val) for test_name in (Test1, Test2, Test3) ) piv;</code>
可擴充的動態透視
對於大量的測試,動態SQL提供了一個可擴展的解決方案:
<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT sbno,' + @cols + ' from ( select test_name, sbno, val from yourtable ) x pivot ( max(val) for test_name in (' + @cols + ') ) p ' execute(@query)</code>
兩種方法都會產生相同的期望輸出。此範例示範如何利用動態SQL來建立靈活且高效的解決方案,以解決複雜的資料處理任務。
以上是如何在不聚合的情況下在 SQL 中執行動態透視?的詳細內容。更多資訊請關注PHP中文網其他相關文章!