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

Mic*_*ley 26 sql t-sql sql-server

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

数据如下所示:

Player Score
001      10
001      20
002      20
002      20
001      10
002      10
003      20
002      20
001      10
Run Code Online (Sandbox Code Playgroud)

我希望它像这样显示它

Player Score
001    10,20
002    10,20
003    20
Run Code Online (Sandbox Code Playgroud)

但我得到的只是得分列中所有数据的组合列表

Player Score
001    10,20,10,10
002    20,20,10,20
003    20
Run Code Online (Sandbox Code Playgroud)

有谁知道如何使这项工作?

Tar*_*ryn 47

对于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
Run Code Online (Sandbox Code Playgroud)

  • 我不知道它是如何工作的但它有效.惊人!谢谢. (6认同)

Geo*_*ald 11

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

SELECT Player, STRING_AGG(Score,', ') FROM YourTable GROUP BY Player
Run Code Online (Sandbox Code Playgroud)

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

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


der*_*ser 6

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

SELECT string_agg(DISTINCT <column>,'delimiter') FROM <table> GROUP BY <column2>
Run Code Online (Sandbox Code Playgroud)

  • @MarwaAhmad `STRING_AGG` 不是 Oracle 函数。这是一个 [PostgreSQL one](https://www.postgresql.org/docs/current/static/functions-aggregate.html)(现在是 SQL Server 2017)。 (2认同)