2017-09-22 33 views
0

對於我的情況,我試圖應用stackoverflow解決方案here用逗號分隔值的分組子句

下面是我的表:

專業:

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 

廚師:

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

到目前爲止,我想出了下面的SQL語句:

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 

結果是:

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

不過,我想獲得的最終結果:

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

發佈標記爲正確副本的鏈接 – scsimon

+2

將專用s1添加到廚師表中並在xml路徑中使用廚師名稱而不是ID號 – twoleggedhorse

+0

您已經完成了難題。要獲取名稱很簡單,它只是在STUFF中查詢中的一個連接。 –

回答

0

你幾乎沒有,所有你需要的是一個INNER JOIN到廚師表你STUFF語句中,然後你只需換出ChefIdName

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 

我有一個工作SQL小提琴這裏舉例:http://www.sqlfiddle.com/#!6/9b7d5/6

+0

我試過你的解決方案,但我得到了錯誤消息'Msg 8116,Level 16,State 1,Line 1 參數數據類型varchar對於stuff函數的參數2無效。' –

+0

cause FOR XML PATH('')),'' jake','tara','')是不正確的...... – scsimon

+0

@TitoyKoh更新了我的答案,我之前在我的手機上,所以我猜測 – twoleggedhorse

1

您可以使用您的查詢的CTE加入名稱:

;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 

輸出如下:

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

您的解決方案很好!只是尋找一個更簡單的解決方案(一個沒有使用Cte)? –