Wie bekomme ich:
id Name Value
1 A 4
1 B 8
2 C 9
zu
id Column
1 A:4, B:8
2 C:9
Wie bekomme ich:
id Name Value
1 A 4
1 B 8
2 C 9
zu
id Column
1 A:4, B:8
2 C:9
GROUP_CONCAT()
Aggregatfunktion leicht lösen , aber das Lösen unter Microsoft SQL Server ist umständlicher. Siehe die folgende SO-Frage für Hilfe: " Wie bekomme ich mehrere Datensätze gegen einen Datensatz basierend auf der Beziehung? "Antworten:
Kein CURSOR, WHILE-Loop oder benutzerdefinierte Funktion erforderlich .
Sie müssen nur mit FOR XML und PATH kreativ sein.
[Hinweis: Diese Lösung funktioniert nur unter SQL 2005 und höher. In der ursprünglichen Frage wurde die verwendete Version nicht angegeben.]
quelle
Wenn es sich um SQL Server 2017 oder SQL Server Vnext, SQL Azure handelt, können Sie string_agg wie folgt verwenden:
quelle
Die Verwendung des XML-Pfads wird nicht wie erwartet perfekt verkettet. Er ersetzt "&" durch "& amp;" und wird auch mit
<" and ">
... vielleicht ein paar anderen Dingen herumspielen, nicht sicher ... aber Sie können dies versuchenIch bin auf eine Problemumgehung gestoßen ... Sie müssen Folgendes ersetzen:
mit:
... oder
NVARCHAR(MAX)
wenn du das benutzt.Warum zum Teufel hat keine
SQL
verkettete Aggregatfunktion? Das ist eine PITA.quelle
Ich lief in ein paar Probleme , als ich versuchte Kevin Fairchilds Vorschlag zur Arbeit Umwandlung mit Streichern Leer- und Sonder XML - Zeichen enthalten (
&
,<
,>
) , die codiert wurden.Die endgültige Version meines Codes (die die ursprüngliche Frage nicht beantwortet, aber für jemanden nützlich sein kann) sieht folgendermaßen aus:
Anstatt ein Leerzeichen als Trennzeichen zu verwenden und alle Leerzeichen durch Kommas zu ersetzen, werden jedem Wert nur ein Komma und ein Leerzeichen vorangestellt und dann
STUFF
die ersten beiden Zeichen entfernt.Die XML-Codierung wird automatisch mithilfe der TYPE- Direktive durchgeführt.
quelle
Eine weitere Option mit SQL Server 2005 und höher
quelle
Installieren Sie die SQLCLR-Aggregate von http://groupconcat.codeplex.com
Dann können Sie Code wie diesen schreiben, um das gewünschte Ergebnis zu erhalten:
quelle
Mit SQL Server 2005 und höher können Sie Ihre eigenen benutzerdefinierten Aggregatfunktionen erstellen , einschließlich Informationen zur Verkettung. Weitere Informationen finden Sie im Beispiel am Ende des verknüpften Artikels.
quelle
Acht Jahre später ... Microsoft SQL Server vNext Database Engine hat Transact-SQL endlich erweitert, um die Verkettung gruppierter Zeichenfolgen direkt zu unterstützen. In der Community Technical Preview Version 1.0 wurde die Funktion STRING_AGG und in CTP 1.1 die Klausel WITHIN GROUP für die Funktion STRING_AGG hinzugefügt.
Referenz: https://msdn.microsoft.com/en-us/library/mt775028.aspx
quelle
Dies ist nur eine Ergänzung zu Kevin Fairchilds Beitrag (übrigens sehr klug). Ich hätte es als Kommentar hinzugefügt, aber ich habe noch nicht genug Punkte :)
Ich benutzte diese Idee für eine Ansicht, an der ich arbeitete, aber die Gegenstände, die ich konzentrierte, enthielten Leerzeichen. Deshalb habe ich den Code leicht geändert, um keine Leerzeichen als Trennzeichen zu verwenden.
Nochmals vielen Dank für die coole Problemumgehung Kevin!
quelle
Ein Beispiel wäre
In Oracle können Sie die LISTAGG-Aggregatfunktion verwenden.
Originalaufzeichnungen
Sql
Ergebnis in
quelle
Diese Art von Frage wird hier sehr oft gestellt, und die Lösung wird stark von den zugrunde liegenden Anforderungen abhängen:
https://stackoverflow.com/search?q=sql+pivot
und
https://stackoverflow.com/search?q=sql+concatenate
Normalerweise gibt es keine reine SQL-Möglichkeit, dies ohne dynamisches SQL, eine benutzerdefinierte Funktion oder einen Cursor zu tun.
quelle
Nur um das zu ergänzen, was Cade gesagt hat, ist dies normalerweise eine Front-End-Anzeige und sollte daher dort behandelt werden. Ich weiß, dass es manchmal einfacher ist, etwas 100% in SQL für Dinge wie den Dateiexport oder andere "Nur SQL" -Lösungen zu schreiben, aber meistens sollte diese Verkettung in Ihrer Anzeigeebene behandelt werden.
quelle
Benötigen Sie keinen Cursor ... eine while-Schleife ist ausreichend.
quelle
Lassen Sie uns ganz einfach werden:
Ersetzen Sie diese Zeile:
Mit Ihrer Anfrage.
quelle
Es wurden keine Kreuzantworten angezeigt, und es ist auch keine XML-Extraktion erforderlich. Hier ist eine etwas andere Version dessen, was Kevin Fairchild geschrieben hat. Es ist schneller und einfacher in komplexeren Abfragen zu verwenden:
quelle
Sie können die Leistung auf folgende Weise erheblich verbessern, wenn die Gruppierung nach hauptsächlich ein Element enthält:
quelle
Verwenden der Ersetzungsfunktion und des FOR JSON-Pfads
Für Beispieldaten und weitere Möglichkeiten klicken Sie hier
quelle
Wenn Sie clr aktiviert haben, können Sie die Group_Concat- Bibliothek von GitHub verwenden
quelle