2017-09-22 2 views
0

Für meine Situation versuche ich, die Stackoverflow-Lösung here anzuwenden.Group By-Klausel mit durch Komma getrennten Werten

Hier sind meine Tabellen:

Spezialität:

Id Dish  ChefId 
1 Caviar  1 
2 Caviar  2 
3 Foie gras 2 
4 Foie gras 3 
5 Foie gras 5 
6 Truffles 1 
7 Truffles 4 

Chef:

Id Name 
1 Jake 
2 Tara 
3 Oscar 
4 Linda 
5 Wally 

Bisher kam ich mit der folgenden SQL-Anweisung auf:

SELECT Dish, ChefId = 
    STUFF((SELECT ', ' + CONVERT(varchar(10), ChefId) 
     FROM Specialty s1 
     WHERE s1.Dish = s2.Dish 
     FOR XML PATH('')), 1, 2, '') 
    FROM Specialty s2 
    GROUP BY Dish 

Mit dem Ergebnis:

Dish  Chef 
Caviar  1, 2 
Foie gras 2, 3, 5 
Truffles 1, 4 

Aber ich möchte das Endergebnis erhalten:

Dish  Chef 
Caviar  Jake, Tara 
Foie gras Tara, Oscar, Wally 
Truffles Jake, Linda 
+0

den Link, der als Duplikat korrekt markiert wurde, eingeben – scsimon

+2

Join Specialty S1 zum Chef Tisch und Verwenden Sie die Chefnamen statt IDs in der für xml Pfad – twoleggedhorse

+0

Sie haben den schwierigen Teil bereits getan. Um die Namen zu erhalten ist trivial, es ist nur ein Join in der Abfrage in Ihrem STUFF. –

Antwort

0

Sie fast da waren, alles, was Sie brauchen, ist ein INNER JOIN auf den Chef-Tabelle in Ihrem STUFF Anweisung und dann tauschen Sie einfach aus ChefId mit Name.

SELECT Dish, ChefId = 
    STUFF((SELECT ', ' + c1.Name 
     FROM Specialty s1 
      INNER JOIN Chef c1 
      ON s1.ChefId = c1.Id 
     WHERE s1.Dish = s2.Dish 
     FOR XML PATH('')), 1, 2, '') 
    FROM Specialty s2 
    GROUP BY Dish 

Ich habe eine funktionierende SQL Fiddle Beispiel hier: http://www.sqlfiddle.com/#!6/9b7d5/6

+0

Ich habe Ihre Lösung versucht, aber ich bekomme den Fehler "Msg 8116, Ebene 16, Status 1, Zeile 1 Argument Datentyp VARCHAR ist ungültig für Argument 2 der Stuff-Funktion. –

+0

Ursache FOR XML PATH ('')) ' jake ',' tara ',' ') ist nicht korrekt .... – scsimon

+0

@TitoyKoh Aktualisiert meine Antwort, ich war auf meinem Handy vor so ich rate – twoleggedhorse

1

Sie Ihre Anfrage mit einem WAK verwenden können, die Namen zu verbinden:

;With Cte as (
    Select s.*, c.[Name] from #speciality S 
    join #Chef c 
    on s.ChefId = c.Id 
) 
SELECT Dish, ChefNames = 
    STUFF((SELECT ', ' + [name] 
     FROM Cte s1 
     WHERE s1.Dish = s2.Dish 
     FOR XML PATH('')), 1, 2, '') 
    FROM Cte s2 
    GROUP BY Dish 

Ausgabe wie folgt:

+-----------+--------------------+ 
| Dish |  ChefNames  | 
+-----------+--------------------+ 
| Caviar | Jake, Tara   | 
| Foie gras | Tara, Oscar, Wally | 
| Truffles | Jake, Linda  | 
+-----------+--------------------+ 
+0

Ihre Lösung funktioniert super! Suchen Sie einfach nach einer einfacheren Lösung (eine ohne Cte)? –

Verwandte Themen