Heim >Datenbank >MySQL-Tutorial >Wie füge ich mehrere SQL-Zeilen mit dynamisch generierten Spalten basierend auf einer Gruppierungsspalte zu einer 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!