Heim >Datenbank >MySQL-Tutorial >Wie füge ich mehrere Zeilen basierend auf dem Testtyp in SQL Server dynamisch zu einer Zeile zusammen?

Wie füge ich mehrere Zeilen basierend auf dem Testtyp in SQL Server dynamisch zu einer Zeile zusammen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-22 01:08:37821Durchsuche

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

Mehrere Zeilen dynamisch zu einer Zeile zusammenführen, basierend auf dem Testtyp (SQL Server)

Frage:

Wir haben eine Tabelle namens Result mit den Spalten WorkOrder, TestType und Result. Wir möchten nach der Spalte TestType gruppieren und mehrere Zeilen mit demselben TestType in einer Zeile zusammenführen. Wir wissen jedoch nicht, wie viele TestType-Spalten es für jedes Result geben wird.

Lösung:

Um dieses Problem zu lösen, können wir dynamisches SQL verwenden. Die folgende Abfrage funktioniert für bis zu 100 Ergebnisse. Bei mehr als 100 Ergebnissen können wir mehr Tally zu N im CTE CROSS JOIN hinzufügen.

<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>

Das obige ist der detaillierte Inhalt vonWie füge ich mehrere Zeilen basierend auf dem Testtyp in SQL Server dynamisch zu einer Zeile zusammen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn