2017-09-22 38 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)? –