Heim >Datenbank >MySQL-Tutorial >Wie gruppiere ich Spalten und kombiniere mehrere Zeilen zu einer einzigen Zeile mit mehreren Spalten in SQL?
Spalten gruppieren und mehrere Zeilen zu einer einzelnen Zeile mit mehreren Spalten in SQL Server zusammenführen
In manchen Fällen möchten Sie möglicherweise Daten nach bestimmten Spalten gruppieren und mehrere Werte aus verwandten Zeilen in einer einzigen Zeile mit mehreren Spalten zusammenfassen. Nehmen wir als Beispiel die folgende Situation:
Sie haben eine Tabelle namens Ergebnis, die die folgenden Spalten enthält:
Die Daten in der Ergebnistabelle sehen folgendermaßen aus:
WorkOrder | TestType | Result |
---|---|---|
HP19002316 | VitaminA | 10.3 |
HP19002316 | VitaminA | 11.3 |
HP19002316 | VitaminA | 12.3 |
HP19002316 | VitaminB | 13.4 |
HP19002316 | VitaminB | 14.4 |
HP19002316 | VitaminC | 15.5 |
HP19002316 | VitaminD | 17.0 |
Sie möchten die Daten in die folgende Struktur umformatieren:
WorkOrder | TestType | Result1 | Result2 | Result3 |
---|---|---|---|---|
HP19002316 | VitaminA | 10.3 | 11.3 | 12.3 |
HP19002316 | VitaminB | 13.4 | 14.4 | NULL |
HP19002316 | VitaminC | 15.5 | NULL | NULL |
HP19002316 | VitaminD | 17.0 | NULL | NULL |
Die Herausforderung besteht hier darin, die Ergebnisse nach Testtyp zu gruppieren und die mehreren Ergebniswerte in separaten Spalten mit der Bezeichnung „Ergebnis1“, „Ergebnis2“ usw. zu kombinieren.
Nicht-dynamische Lösung
Für eine feste Anzahl von Ergebnissen können Sie einen einfachen Ansatz verwenden:
<code class="language-sql">WITH RNs AS ( SELECT WorkOrder, TestType, Result, ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN FROM dbo.Result ) SELECT WorkOrder, TestType, MAX(CASE RN WHEN 1 THEN Result END) AS Result1, MAX(CASE RN WHEN 2 THEN Result END) AS Result2, MAX(CASE RN WHEN 3 THEN Result END) AS Result3 FROM RNs R GROUP BY WorkOrder, TestType;</code>
Diese Abfrage beschränkt die Ergebnisse auf drei Spalten: Ergebnis1, Ergebnis2 und Ergebnis3. Für dynamische Ergebnismengen ist jedoch eine komplexere Lösung erforderlich.
Dynamische Lösungen
Um eine unsichere Anzahl von Ergebnissen zu verarbeiten, können Sie eine dynamische SQL-Abfrage verwenden, die automatisch die erforderlichen Spalten erstellt:
<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) 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 + --由于不知道 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>
Diese Abfrage generiert eine dynamische SQL-Anweisung, die basierend auf der maximalen Anzahl von Ergebnissen für jeden Testtyp eine ausreichende Anzahl von Ergebnisspalten erstellt. Es verwendet einen CTE (Common Table Expression) namens Tally, um die Spaltennummer der Ergebnisspalte dynamisch zu generieren.
Das obige ist der detaillierte Inhalt vonWie gruppiere ich Spalten und kombiniere mehrere Zeilen zu einer einzigen Zeile mit mehreren Spalten in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!