首頁 > 資料庫 > mysql教程 > 如何在 SQL 中動態地將行轉換為列而不進行聚合?

如何在 SQL 中動態地將行轉換為列而不進行聚合?

Patricia Arquette
發布: 2025-01-08 00:51:42
原創
149 人瀏覽過

此 SQL 程式碼動態地將行轉換為列,而不會遺失資料類型,這通常需要聚合函數。讓我們重新表達一下,使其更加清晰並提高可讀性。

How to Dynamically Pivot Rows to Columns in SQL Without Aggregation?

在 SQL 中動態地將行轉換為列:型別保留解決方案

標準 SQL PIVOT 操作通常需要聚合函數(如 MAXMIN),這可能會導致資料遺失或類型強制。此範例示範了一種動態 SQL 方法,可將行轉換為列,同時保留原始資料類型,最多處理 12 個測試名稱。

挑戰在於將具有可變數量的測試名稱(最多 12 個)和混合資料類型的表轉換為每個測試名稱成為一列的表。 需要一個動態解決方案來適應這種變化。

動態 SQL 解決方案

這個解決方案巧妙地使用動態 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>
登入後複製

程式碼首先根據唯一的 @cols 值建立一個以逗號分隔的列名稱清單 (TEST_NAME)。 然後,它使用 PIVOT 作為聚合函數來建構 @query 查詢 (MAX(val))。 當使用 MAX 時,因為我們以每個 SBNO 內的唯一值為基礎,這有效地保留了原始資料。 最後,執行產生的查詢。

說明性輸出

輸出表將為每個唯一的測試名稱有一列,並用原始表中的對應值填充,並保持其原始資料類型:

<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 中的動態旋轉提供強大的解決方案。 請記得將 yourtable 替換為您的表的實際名稱。

以上是如何在 SQL 中動態地將行轉換為列而不進行聚合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板