Ich habe einige customer_comments
aufgrund des Datenbankdesigns in mehrere Zeilen aufgeteilt, und für einen Bericht muss ich die comments
einzelnen Elemente id
in einer Zeile kombinieren . Ich habe zuvor versucht, mit dieser abgegrenzten Liste aus der SELECT-Klausel und dem COALESCE- Trick etwas zu arbeiten , kann mich aber nicht daran erinnern und muss sie nicht gespeichert haben. Ich kann es auch in diesem Fall nicht zum Laufen bringen, es scheint nur in einer einzelnen Zeile zu funktionieren.
Die Daten sehen folgendermaßen aus:
id row_num customer_code comments
-----------------------------------
1 1 Dilbert Hard
1 2 Dilbert Worker
2 1 Wally Lazy
Meine Ergebnisse müssen so aussehen:
id customer_code comments
------------------------------
1 Dilbert Hard Worker
2 Wally Lazy
Für jeden row_num
gibt es also nur eine Reihe von Ergebnissen. Die Kommentare sollten in der Reihenfolge von zusammengefasst werden row_num
. Der oben genannte verknüpfte SELECT
Trick funktioniert, um alle Werte für eine bestimmte Abfrage als eine Zeile abzurufen, aber ich kann nicht herausfinden, wie er als Teil einer SELECT
Anweisung funktioniert, die alle diese Zeilen ausspuckt.
Meine Abfrage muss die gesamte Tabelle alleine durchgehen und diese Zeilen ausgeben. Ich kombiniere sie nicht in mehrere Spalten, eine für jede Zeile, also PIVOT
scheint dies nicht zutreffend zu sein.
quelle
order by
in der Unterabfrage garantiert ist . Dies ist das Erstellen von XML mitfor xml
und das ist der Weg, XML mit TSQL zu erstellen. Die Reihenfolge der Elemente in XML-Dateien ist eine wichtige Angelegenheit, auf die Sie sich verlassen können. Wenn diese Technik die Reihenfolge nicht garantiert, ist die XML-Unterstützung in TSQL schwer beschädigt.row_num desc
muss denorder by
von Mikael vorgeschlagenen Werten entsprechen). Ich werde Kommentare entfernen, die andernfalls vorschlagen, dass die Abfrage das Richtige enthält,order by
und hoffe, dass @JonSeigel das Gleiche erwägt.Wenn Sie CLR in Ihrer Umgebung verwenden dürfen, ist dies ein maßgeschneiderter Fall für ein benutzerdefiniertes Aggregat.
Dies ist wahrscheinlich der richtige Weg, wenn die Quelldaten nicht trivial groß sind und / oder Sie in Ihrer Anwendung häufig solche Aufgaben ausführen müssen. Ich vermute sehr, dass der Abfrageplan für Aarons Lösung nicht gut skaliert wird, wenn die Eingabegröße zunimmt. (Ich habe versucht, der temporären Tabelle einen Index hinzuzufügen, aber das hat nicht geholfen.)
Diese Lösung ist, wie viele andere Dinge, ein Kompromiss:
EDIT: Nun, ich habe versucht herauszufinden, ob dies tatsächlich besser ist, und es stellt sich heraus, dass die Anforderungen, dass die Kommentare in einer bestimmten Reihenfolge vorliegen, derzeit mit einer Aggregatfunktion nicht erfüllt werden können. :(
Siehe SqlUserDefinedAggregateAttribute.IsInvariantToOrder . Im Grunde, was Sie tun müssen , ist
OVER(PARTITION BY customer_code ORDER BY row_num)
aberORDER BY
nicht in der unterstützteOVER
Klausel , wenn die Aggregation. Ich gehe davon aus, dass das Hinzufügen dieser Funktionalität zu SQL Server eine Dose Würmer öffnet, da es trivial ist, was im Ausführungsplan geändert werden müsste. Der oben genannte Link besagt, dass dies für die zukünftige Verwendung reserviert ist, so dass dies in Zukunft implementiert werden könnte (2005 haben Sie jedoch wahrscheinlich kein Glück).Dies könnte immer noch erreicht werden, indem der
row_num
Wert in die aggregierte Zeichenfolge gepackt und analysiert wird und dann die Sortierung innerhalb des CLR-Objekts durchgeführt wird ... was ziemlich hackisch erscheint.In jedem Fall ist unten der Code aufgeführt, den ich verwendet habe, falls jemand dies trotz der Einschränkung für nützlich hält. Ich lasse den Hacking-Teil als Übung für den Leser. Beachten Sie, dass ich AdventureWorks (2005) für Testdaten verwendet habe.
Aggregatmontage:
T-SQL zum Testen (
CREATE ASSEMBLY
undsp_configure
zum Aktivieren von CLR weggelassen):quelle
Hier ist eine Cursor-basierte Lösung, die die Reihenfolge der Kommentare nach garantiert
row_num
. (Sehen Sie sich meine andere Antwort an, um zu erfahren, wie die[dbo].[Comments]
Tabelle gefüllt wurde.)quelle
quelle