2017-07-19 20 views
0

我有以下声明:SELECT STUFF和where子句来缩小结果

SELECT Stuff(
    (SELECT N', ' + activity FROM contact_categories FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N'') 

这显示从活动列的所有信息保存在一个字符串。我想要做的是将它作为一个字符串返回,但对于每个主键。

所以在表中它看起来像这样

Contact Activity 
1  Green 
1  Red 
1  Blue 
2  Green 
2  Red 
2  Blue 
3  Green 
3  Red 
3  Blue 

而不是显示它作为绿,青,绿,红,红,红,蓝,青,蓝都在一个字符串。我想它显示:

1 Green, Red, Blue 

2 Green, Red, Blue 

3 Green, Red, Blue 

我试图添加和where子句:

SELECT Stuff(
    (SELECT N', ' + activity FROM contact_categories FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N'') 
FROM contact_categories 
WHERE contact_number = # 
+0

标签您正在使用的数据库管理系统。 (产品特定查询。) – jarlh

+0

Tagged,thanks! – NickR193

+0

[ListSQL在SQLSERVER]中可能有重复(https://stackoverflow.com/questions/15477743/listagg-in-sqlserver) –

回答

1

你应该使用GROUP BY

SELECT 
    contact, 
    Stuff(
    (SELECT N', ' + activity FROM contact_categories WHERE Contact = S.Contact FOR XML PATH(''),TYPE) 
    .value('text()[1]','nvarchar(max)'),1,2,N'') 
FROM contact_categories AS S 
GROUP BY contact 
+0

非常感谢! – NickR193

1
SELECT distinct contact, Stuff(
    (SELECT N', ' + activity FROM contact_categories t2 WHERE t1.contact = t2.contact FOR 
    XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,N'') 
FROM contact_categories t1 
+0

它也给出相同的结果 – umasankar