無需聚合函數的 SQL 行轉列操作
在資料處理中,將行資料轉換為列資料(行轉列)是一種常見的需求,這對於基於多個屬性的匯總或分析資料特別有用。
SQL 中的 PIVOT 函式可以實現行轉列運算。然而,PIVOT 函數通常需要結合聚合函數(如 MAX 或 MIN)來處理透視後的值。但在某些情況下,我們希望進行簡單的值透視,而無需任何聚合操作。
例如,考慮一個名為 "TEST" 的表,包含以下列:
VAL 欄位包含各種資料型態(整數、小數或 varchar)。目標是將 TEST_NAME 欄位轉換為三個單獨的欄位(Test1、Test2 和 Test3),無需任何聚合:
<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>
為了實現這一目標,無需使用任何聚合函數,我們可以使用動態 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 語句,其中包含 TEST_NAME 的所有唯一值作為列名。然後,它使用 PIVOT 函數將行資料轉換為列,而無需套用任何聚合。
執行此 SQL 將產生所需的輸出,即包含透視列 Test1、Test2 和 Test3 的表,其中包含原始表的對應 VAL 值。
This revised output maintains the original meaning while using slightly different wording and sentence structure. The technical details remain unchanged.
以上是如何在不聚合的情況下將 SQL 中的行轉換為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!