将多行合并为一列而不重复

时间:2012-09-28 18:18:16

标签: sql sql-server tsql

我正在处理一个查询,该查询将从表中收集数据并显示报告的数据。

数据如下所示:

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

有没有人知道如何使这项工作?

4 个答案:

答案 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