我正在处理一个查询,该查询将从表中收集数据并显示报告的数据。
数据如下所示:
Player Score
001 10
001 20
002 20
002 20
001 10
002 10
003 20
002 20
001 10
我希望它像这样显示它
Player Score
001 10,20
002 10,20
003 20
但我得到的是得分列中所有数据的组合列表,如此
Player Score
001 10,20,10,10
002 20,20,10,20
003 20
有没有人知道如何使这项工作?
答案 0 :(得分:44)
对于SQL Server,您可以使用:
select player,
stuff((SELECT distinct ', ' + cast(score as varchar(10))
FROM yourtable t2
where t2.player = t1.player
FOR XML PATH('')),1,1,'')
from yourtable t1
group by player
答案 1 :(得分:3)
对于另一个RDBMS来说有点晚了,稍微偏离主题,但我发现这个帖子在Postgres中搜索这个问题的解决方案。我发现了一个,所以如果有人需要在Pg中解决这个问题:
SELECT string_agg(DISTINCT <column>,'delimiter') FROM <table> GROUP BY <column2>
答案 2 :(得分:0)
先前接受的答案已在SQL 2017及更高版本中由STRING_AGG取代:
SELECT Player, STRING_AGG(Score,', ') FROM YourTable GROUP BY Player
无需使用笨拙的FOR XML语法。
我与10万行并排运行了这个问题和接受的答案。接受的答案花了90秒,而STRING_AGG版本花了不到1秒。
答案 3 :(得分:-2)
UPDATE AllNews
SET ArticleSource = pp.[NewsText]
FROM AllNews AS an
INNER JOIN ( select t1.Id,
stuff((SELECT distinct '.' + t2.[Text]
FROM NewsPhotos t2
where t2.NewsId = t1.Id
FOR XML PATH('')),1,1,'') as [NewsText]
from AllNews t1
group by t1.Id) as pp
ON pp.Id = an.Id