33

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

数据如下所示:

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

4 回答 4

56

对于 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
于 2012-09-28T18:22:31.827 回答
8

对于另一个 RDBMS 来说有点晚了,而且有点离题,但我发现这个线程在 Postgres 中寻找解决这个问题的方法。我找到了一个,所以如果其他人需要在 Pg 中解决这个问题:

SELECT string_agg(DISTINCT <column>,'delimiter') FROM <table> GROUP BY <column2>
于 2013-04-12T19:24:25.073 回答
3

以前接受的答案在 SQL 2017 及更高版本中被 STRING_AGG 取代:

SELECT Player, STRING_AGG(Score,', ') FROM YourTable GROUP BY Player

无需使用笨拙的 FOR XML 语法。

我在 100K 行上并排运行了这个和接受的答案。接受的答案需要 90 秒,STRING_AGG 版本需要不到 1 秒。

于 2020-09-23T14:39:25.383 回答
-3
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
于 2018-05-23T18:16:21.697 回答