Sql 如果计数(值)>;1,将所有值合并到单个单元格中

Sql 如果计数(值)>;1,将所有值合并到单个单元格中,sql,sql-server,sql-server-2008,tsql,ssms,Sql,Sql Server,Sql Server 2008,Tsql,Ssms,可能重复: 如果记录数大于1,我希望将某个字段中的所有记录合并到一个单元格中(另一列中的每个值)。例如,如果我有以下代码 SELECT city, count(zoo name) AS 'count of zoo name' FROM mytable 它将产生以下结果 原来的桌子是这样的 由于亚特兰大和纽约都有不止一个动物园,而东京只有一个动物园,最终的结果应该是这样的 我该怎么做呢?我曾考虑过使用PIVOT构造,但这会为每个可能的值创建新的列。我还必须把每一个可能的动物园名字都写进P

可能重复:

如果记录数大于1,我希望将某个字段中的所有记录合并到一个单元格中(另一列中的每个值)。例如,如果我有以下代码

SELECT city, count(zoo name) AS 'count of zoo name' FROM mytable
它将产生以下结果

原来的桌子是这样的

由于亚特兰大和纽约都有不止一个动物园,而东京只有一个动物园,最终的结果应该是这样的


我该怎么做呢?我曾考虑过使用PIVOT构造,但这会为每个可能的值创建新的列。我还必须把每一个可能的动物园名字都写进PIVOT。这将是一种不好的形式,因为实际数据中“zoo name”的值可能比上述值多得多。

您可以使用XML路径来计算列值

;With Cte(city,concat) as
(
    select city, (select a.Zoo+','
    from Sample a
    where a.city=b.city
    for XML PATH ('') )  concat
    from Sample b
    group by city
 )
Select city,left(concat, len(concat) -1) from cte

检查

中的结果,我将修剪此结果以删除结尾的逗号
LEFT(concat,LEN(concat)-1)
这最后会有一个额外的
,因此您可能希望将其包装在另一个select中,并将
LEFT(concat,LEN(concat)-1)
添加到concat字段更新了我的答案。谢谢您指出这一点。!谢谢,成功了。你能解释一下“XML路径(“”))concat”在做什么吗?