SELECT STUFF和where子句缩小结果范围

时间:2017-07-19 09:17:29

标签: sql sql-server

我有以下声明:

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

我尝试添加from和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 = #

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

答案 2 :(得分:0)

你考虑过使用LISTAGG吗?

SELECT contact,
    listagg(activity, ', ') WITHIN GROUP (
ORDER BY 1) AS activity
FROM contact_categories
GROUP BY contact;

https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030