Zusammenfassen mehrerer SQL-Zeilen in einer einzigen durch Kommas getrennten Spalte
In diesem Artikel wird gezeigt, wie Sie mehrere Zeilen mit einem gemeinsamen Bezeichner in einer einzigen Zeile mit einer durch Kommas getrennten Liste in einer bestimmten Spalte zusammenfassen. Das Beispiel verwendet eine Tabelle mit Ticket-IDs und zugehörigen Personen, um ein Ergebnis zu erstellen, bei dem jede Ticket-ID mit einer Liste aller beteiligten Personen verknüpft ist.
SQL Server-Ansatz (2005 und höher)
Die folgende SQL Server-Abfrage erreicht dies mithilfe von STUFF()
, ISNULL()
und FOR XML PATH
:
<code class="language-sql">SELECT t.TicketID, STUFF(ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma], ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID</code>
Diese Abfrage verwendet eine Unterabfrage, um mit jedem TicketID
verknüpfte Personen zu sammeln. Die FOR XML PATH
-Methode wandelt das Ergebnis in eine verkettete Zeichenfolge um und STUFF()
entfernt alle führenden Kommas. Die Funktion ISNULL()
behandelt Fälle, in denen einem Ticket keine Personen zugeordnet sind. Die optionalen Spalten bieten Flexibilität beim Umgang mit führenden Kommas.
Oracle-Lösung
Oracle bietet eine prägnantere Lösung mit der Funktion LISTAGG()
:
<code class="language-sql">SELECT TicketID, LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People FROM @Tickets</code>
LISTAGG()
fasst Werte direkt in einer durch Kommas getrennten Liste zusammen, sortiert nach der Spalte Person
. Die PARTITION BY
-Klausel stellt sicher, dass die Aggregation für jedes einzelne TicketID
erfolgt. Diese Methode ist deutlich einfacher und effizienter als das SQL Server-Äquivalent.
Das obige ist der detaillierte Inhalt vonWie verkette ich mehrere Zeilen in einer durch Kommas getrennten Liste in SQL Server und Oracle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!