Heim >Datenbank >MySQL-Tutorial >Wie füge ich mehrere SQL-Zeilen mit dynamisch generierten Spalten basierend auf einer Gruppierungsspalte zu einer zusammen?

Wie füge ich mehrere SQL-Zeilen mit dynamisch generierten Spalten basierend auf einer Gruppierungsspalte zu einer zusammen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-22 01:22:09354Durchsuche

How to Merge Multiple SQL Rows into One with Dynamically Generated Columns Based on a Grouping Column?

Generieren Sie dynamisch Spalten basierend auf Gruppierungsspalten und führen Sie mehrere Zeilen mit SQL-Daten zusammen

Frage:

Wie gruppiere ich Daten nach einer bestimmten Spalte und füge mehrere Zeilen mit demselben Spaltenwert in einer einzigen Zeile zusammen, wodurch mehrere Spalten gleichzeitig generiert werden? Insbesondere müssen Sie nach der Spalte „TestType“ gruppieren und die Spalte „Result“ für jeden passenden „TestType“-Wert in eine separate Spalte aufteilen.

Antwort:

Dies kann mithilfe der Kreuztabelle (PIVOT) in SQL Server erreicht werden. Wenn die Anzahl der Spalten pro Gruppe jedoch dynamisch ist (d. h. sich ändern kann), ist eine flexiblere Lösung erforderlich:

Dynamische Lösung mit FOR XML PATH:

CTE mit Zeilennummer erstellen:

<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
)</code>

Erstellen Sie eine dynamische SQL-Anweisung:

<code class="language-sql">DECLARE @SQL nvarchar(MAX);
DECLARE @CRLF nvarchar(2) = CHAR(13) + CHAR(10); --回车换行符

-- 获取任何“TestType”的最大结果数
SELECT @MaxTally = MAX(C)
FROM (
    SELECT COUNT(*) AS C
    FROM dbo.Result
    GROUP BY WorkOrder,
             TestType
);

-- 创建具有最大行数的计数表
WITH Tally AS (
    SELECT TOP (@MaxTally) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N),
         (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)
)

-- 构建动态SQL语句
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 +
              -- 使用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;'</code>

Dynamische SQL-Anweisung ausführen:

<code class="language-sql">PRINT @SQL; -- 查看SQL语句

EXEC sys.sp_executesql @SQL;</code>

Diese Lösung generiert dynamisch Spalten basierend auf der maximalen Anzahl von Ergebnissen für jeden „TestType“, was zur gewünschten Ausgabe führt. @CRLF Dem Code wurden Variablen hinzugefügt, um die Lesbarkeit des Codes zu verbessern und die plattformübergreifende Kompatibilität zu verbessern.

Das obige ist der detaillierte Inhalt vonWie füge ich mehrere SQL-Zeilen mit dynamisch generierten Spalten basierend auf einer Gruppierungsspalte zu einer 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