首頁 > 資料庫 > mysql教程 > 如何使用基於分組列動態產生的列將多個 SQL 行合併為一個?

如何使用基於分組列動態產生的列將多個 SQL 行合併為一個?

Mary-Kate Olsen
發布: 2025-01-22 01:22:09
原創
366 人瀏覽過

How to Merge Multiple SQL Rows into One with Dynamically Generated Columns Based on a Grouping Column?

基於分組列動態產生列,合併多行SQL資料

問題:

如何按特定列分組數據,並將具有相同列值的多行合併為單行,同時產生多個列?具體來說,需要按「TestType」欄位分組,並將「Result」欄位拆分為每個符合「TestType」值的單獨欄位。

解答:

可以使用SQL Server中的交叉表(PIVOT)實現此目的。但是,如果每個組的列數是動態的(即可能變化),則需要更靈活的解決方案:

使用FOR XML PATH的動態解:

建立帶行號的CTE:

WITH RNs AS (
    SELECT WorkOrder,
           TestType,
           Result,
           ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN
    FROM dbo.Result
)
登入後複製

建立動態SQL語句:

DECLARE @SQL nvarchar(MAX);
DECLARE @CRLF nvarchar(2) = CHAR(13) + CHAR(10); --回车换行符

-- 获取任何“TestType”的最大结果数
SELECT @MaxTally = MAX(C)
FROM (
    SELECT COUNT(*) AS C
    FROM dbo.Result
    GROUP BY WorkOrder,
             TestType
);

-- 创建具有最大行数的计数表
WITH Tally AS (
    SELECT TOP (@MaxTally) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N),
         (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)
)

-- 构建动态SQL语句
SELECT @SQL = N'WITH RNs AS (' + @CRLF +
              N'    SELECT WorkOrder, ' + @CRLF +
              N'           TestType, ' + @CRLF +
              N'           Result, ' + @CRLF +
              N'           ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN ' + @CRLF +
              N'    FROM dbo.Result)' + @CRLF +
              N'SELECT WorkOrder, ' + @CRLF +
              N'       TestType, ' + @CRLF +
              -- 使用FOR XML PATH动态生成列
              STUFF((SELECT N',' + @CRLF +
                            CONCAT(N'       MAX(CASE RN WHEN ',T.I,N' THEN Result END) AS Result',T.I)
                     FROM Tally T
                     ORDER BY T.I ASC
                     FOR XML PATH(N''), TYPE).value('(./text())[1]','nvarchar(MAX)'),1,3,N'') + @CRLF +
              N'FROM RNs R ' + @CRLF +
              N'GROUP BY WorkOrder, ' + @CRLF +
              N'         TestType;'
登入後複製

執行動態SQL語句:

PRINT @SQL; -- 查看SQL语句

EXEC sys.sp_executesql @SQL;
登入後複製

此解將根據每個「TestType」的最大結果數動態產生列,從而得到所需輸出。 程式碼中新增了 @CRLF 變數用於更好的程式碼可讀性,並增強了跨平台相容性。

以上是如何使用基於分組列動態產生的列將多個 SQL 行合併為一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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