CONCAT(Spalte) OVER(PARTITION BY...)? Gruppe-concatentating Zeilen ohne Gruppierung das Ergebnis selbst

Ich brauche einen Weg, um eine Verkettung aller Zeilen (pro Gruppe) in einer Art Fenster-Funktion, wie Sie tun können COUNT(*) OVER(PARTITION BY...) und der aggregierten Anzahl der Zeilen pro Gruppe wiederholt über jede einzelne Gruppe. Ich brauche etwas ähnlich, aber mit einer string-Verkettung alle Werte pro Gruppe wiederholt über jede Gruppe.

Hier finden Sie einige Beispiel-Daten und der von mir gewünschten Ergebnis besser zu veranschaulichen mein problem:

grp  |  val
------------
1    |  a
1    |  b
1    |  c
1    |  d
2    |  x
2    |  y
2    |  z

Und hier ist, was ich brauche (das gewünschte Ergebnis):

grp  |   val  |  groupcnct
---------------------------------
1    |   a    |  abcd
1    |   b    |  abcd
1    |   c    |  abcd
1    |   d    |  abcd
2    |   x    |  xyz
2    |   y    |  xyz
2    |   z    |  xyz

Hier ist der wirklich interessante Teil dieses Problems:

Meine Besondere situation, die mich daran hindert zu können, auf die gleiche Tabelle zweimal (ich bin tatsächlich tun dies in einem rekursiven Allgemeinen Tabellenausdruck, so kann ich das nicht eine self-join-Tabellenausdruck oder es wirft einen Fehler).

Ich bin mir voll bewusst, dass man so etwas machen kann:

SELECT      a.*, b.groupcnct
FROM        tbl a
CROSS APPLY (
            SELECT STUFF((
                        SELECT '' + aa.val 
                        FROM   tbl aa
                        WHERE  aa.grp = a.grp
                        FOR XML PATH('')
                   ), 1, 0, '') AS groupcnct
            ) b

Aber wie Sie sehen können, dass die auf tbl zwei mal in der Abfrage.

Kann ich nur Referenz tbl einmal, also warum Frage ich mich, ob Teilbild-Gruppe-Verkettung ist möglich (ich bin ein bisschen neu TSQL, da komme ich aus einer MySQL-hintergrund, so dass nicht sicher, ob so etwas gemacht werden kann).


Tabelle Erstellen:

CREATE TABLE tbl
    (grp int, val varchar(1));

INSERT INTO tbl
    (grp, val)
VALUES
    (1, 'a'),
    (1, 'b'),
    (1, 'c'),
    (1, 'd'),
    (2, 'x'),
    (2, 'y'),
    (2, 'z');
  • Es ist eigentlich eine Folge, nicht eine Tabelle. Die Abfrage ist bereits getan wird, in einem rekursiven Allgemeinen Tabellenausdruck, so die Allgemeine Tabellenausdrücke verwenden, ist keine option. Der Grund, warum ich brauche dies, weil ich versuche zu verfolgen, Werte aus vorherigen Rekursion Schichten, wie ich recurse durch den Tisch mit einer CTE.
  • Diese Frage macht nicht viel Sinn ohne die rekursive Abfrage. Sie können immer das Ergebnis der Abfrage in eine temporäre Tabelle und der Gruppe concat auf, dass.
  • Unter Berufung auf die rekursive version, um zu zeigen, dass es nicht gut ist, das zu wählen, Vorgehensweise: stackoverflow.com/questions/11137075/..., Es ist besser XML PATH
InformationsquelleAutor Zane Bien | 2012-08-19
Schreibe einen Kommentar