首頁 >資料庫 >mysql教程 >如何在不聚合的情況下將 SQL 中的行轉換為列?

如何在不聚合的情況下將 SQL 中的行轉換為列?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-08 00:21:41727瀏覽

How to Pivot Rows to Columns in SQL Without Aggregation?

無需聚合函數的 SQL 行轉列操作

在資料處理中,將行資料轉換為列資料(行轉列)是一種常見的需求,這對於基於多個屬性的匯總或分析資料特別有用。

SQL 中的 PIVOT 函式可以實現行轉列運算。然而,PIVOT 函數通常需要結合聚合函數(如 MAX 或 MIN)來處理透視後的值。但在某些情況下,我們希望進行簡單的值透視,而無需任何聚合操作。

例如,考慮一個名為 "TEST" 的表,包含以下列:

  • TEST_NAME
  • SBNO
  • VAL

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn