ホームページ >データベース >mysql チュートリアル >SQL Server のテスト タイプに基づいて複数の行を 1 つの行に動的にマージする方法

SQL Server のテスト タイプに基づいて複数の行を 1 つの行に動的にマージする方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-22 01:08:37780ブラウズ

How to Dynamically Merge Multiple Rows into One Row Based on Test Type in SQL Server?

テストの種類に基づいて複数の行を 1 つの行に動的にマージします (SQL Server)

質問:

ResultWorkOrderTestType を持つ Result というテーブルがあります。 TestType 列でグループ化し、同じ TestType を持つ複数の行を 1 つの行にマージしたいと考えています。ただし、各 TestTypeResult 列がいくつあるのかはわかりません。

解決策:

この問題を解決するには、動的 SQL を使用できます。次のクエリは、最大 100 件の結果に対して機能します。結果が 100 件を超える場合は、CTE Tally の N に CROSS JOIN をさらに追加できます。

<code class="language-sql">DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10),
        @MaxTally int;

SELECT @MaxTally = MAX(C)
FROM (SELECT COUNT(*) AS C
      FROM dbo.Result
      GROUP BY WorkOrder,
               TestType) R;

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@MaxTally) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2) --100 行,更多行需要添加更多 N
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 --ORDER BY 应为您的 ID/始终递增列' + @CRLF +
              N'    FROM dbo.Result)' + @CRLF +
              N'SELECT WorkOrder,' + @CRLF +
              N'       TestType,' + @CRLF +
              --由于不知道 SQL Server 版本,因此使用 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;';

PRINT @SQL; --您的好帮手。

EXEC sys.sp_executesql @SQL;</code>

以上がSQL Server のテスト タイプに基づいて複数の行を 1 つの行に動的にマージする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。