2016-03-22 24 views
2

Bazı aramalar yaptım ve bu sorunun birkaç kez daha önce sorulduğunu görebiliyorum, ancak çözümleri kendi çalışma örneğime çeviremiyorum. Beni doğru yöne yönlendiren var mı?SQL Server için GROUP_CONCAT

Ben yaptıkları tüm spor listeleme kişi başına bir satır döndüren bir SELECT sorgusu istiyorum

People 
+-------+------------+ 
| uid | person | 
+-------+------------+ 
| 1 | Tom  | 
+-------+------------+ 
| 2 | Dick  | 
+-------+------------+ 
| 3 | Harry  | 
+-------+------------+ 
| 4 | Peter  | 
+-------+------------+ 
| 5 | Paul  | 
+-------+------------+ 

Sports 
+---------+----------------+ 
| gid | group_name | 
+---------+----------------+ 
| 1 | Dancing  | 
+---------+----------------+ 
| 2 | Golf   | 
+---------+----------------+ 
| 3 | Football  | 
+---------+----------------+ 
| 4 | Tennis   | 
+---------+----------------+ 
| 5 | Squash   | 
+---------+----------------+ 

Teams 
+---------+---------+ 
| gid | uid | 
+---------+---------+ 
| 1 | 1 | 
+---------+---------+ 
| 2 | 1 | 
+---------+---------+ 
| 3 | 1 | 
+---------+---------+ 
| 1 | 2 | 
+---------+---------+ 
| 2 | 2 | 
+---------+---------+ 
| 3 | 2 | 
+---------+---------+ 
| 4 | 2 | 
+---------+---------+ 
| 2 | 3 | 
+---------+---------+ 
| 1 | 4 | 
+---------+---------+ 
| 5 | 4 | 
+---------+---------+ 
| 1 | 5 | 
+---------+---------+ 
| 4 | 5 | 
+---------+---------+ 
| 3 | 5 | 
+---------+---------+ 

aşağıdaki gibi üç veritabanı tablolar (virgülle ayrılmış). Yukarıdaki örnekte, sonuç

+-------+------------+----------------------------------+ 
| uid | person | group_name      | 
+-------+------------+----------------------------------+ 
| 1 | Tom  | Dancing, Golf, Football   | 
+-------+------------+----------------------------------+ 
| 2 | Dick  | Dancing, Golf, Football, Tennis | 
+-------+------------+----------------------------------+ 
| 3 | Harry  | Golf        | 
+-------+------------+----------------------------------+ 
| 4 | Peter  | Dancing, Squash     | 
+-------+------------+----------------------------------+ 
| 5 | Paul  | Tennis, Football     | 
+-------+------------+----------------------------------+ 

MySQL, ben GROUP_CONCAT kullanırsınız olurdu, ama bu durumda ben SQL SERVER kullanıyorum.

Herhangi biri yardımcı olabilir mi?

+2

XML PATH için YAPILANDIRMA ... 'yı deneyin (' ') ' – Wanderer

+0

Çözümlerin hiçbiri neden gönderilmemiş? Bu soru hiçbir araştırma çabası göstermiyor. –

+0

Diğer çözümler, iki tablodan bilgi toplarken, ihtiyaçlarımın üç tablodan nasıl oluştuğunu gösterir. Kendi değişiklik çabalarım farklı hatalar üretiyor, en son "Değişkenlik, varchar değerini dönüştürürken başarısız oldu", "veri türü int'ye dönüştü" – Typhoon101

cevap

2
SELECT p.uid, p.person, 
     stuff (g.group_name, 1, 1, '') as group_name 
FROM People p 
CROSS APPLY 
(
    SELECT ',' + s.group_name 
    FROM Teams t 
      INNER JOIN Sports s ON t.gid = s.gid 
    WHERE t.uid = p.uid 
    ORDER BY s.group_name 
    FOR XML PATH ('') 
) g (group_name) 
+2

Neden düşüş var? yorumlara dikkat etmek ister misiniz? – Squirrel