Heim >Datenbank >MySQL-Tutorial >Wie füge ich mehrere Zeilen basierend auf dem Testtyp in SQL Server dynamisch zu einer Zeile zusammen?
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!