Heim >Datenbank >MySQL-Tutorial >Wie gruppiere ich Spalten und kombiniere mehrere Zeilen zu einer einzigen Zeile mit mehreren Spalten in SQL?

Wie gruppiere ich Spalten und kombiniere mehrere Zeilen zu einer einzigen Zeile mit mehreren Spalten in SQL?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-22 01:17:11309Durchsuche

How to Group Columns and Combine Multiple Rows into a Single Row with Multiple Columns 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:

  • WorkOrder: Kennung für einen bestimmten Auftrag
  • TestType: Art des ausgeführten Tests
  • Ergebnis: Testergebnis

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!

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