Heim >Datenbank >MySQL-Tutorial >Wie gruppiere ich nach Spalten und füge mehrere Zeilen mit einer dynamischen Anzahl von Spalten in SQL zu einer zusammen?

Wie gruppiere ich nach Spalten und füge mehrere Zeilen mit einer dynamischen Anzahl von Spalten in SQL zu einer zusammen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-22 01:12:09656Durchsuche

How to Group by Column and Merge Multiple Rows into One with a Dynamic Number of Columns in SQL?

Dynamische Spaltengruppierung und Zusammenführung mehrerer Zeilen in SQL Server

Frage:

In der Datenbanktabelle gibt es mehrere Ergebniszeilen für jede TestType- und WorkOrder-Kombination. Das Ziel besteht darin, nach TestType zu gruppieren und die Ergebnisse in einer einzigen Zeile zusammenzuführen, wobei jeder Ergebniswert in einer separaten Spalte steht.

Lösung:

Dynamische Lösungen sind erforderlich, um eine ungewisse Anzahl von Ergebnissen zu bewältigen. Das folgende Skript kann bis zu 100 Ergebnisse verarbeiten. Bei mehr als 100 Ergebnissen müssen im CTE Tally weitere CROSS JOINs hinzugefügt werden.

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

Beispieldaten:

<code class="language-sql">CREATE TABLE Result(WorkOrder varchar(10), TestType varchar(20), Result decimal(10,2));
INSERT INTO Result (WorkOrder, TestType, Result) VALUES 
('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)</code>

Erwartete Ausgabe:

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

Das obige ist der detaillierte Inhalt vonWie gruppiere ich nach Spalten und füge mehrere Zeilen mit einer dynamischen Anzahl von Spalten in SQL 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