【问题标题】:Merge multiple rows into one column without duplicates将多行合并为一列而不重复
【发布时间】:2012-09-20 15:37:03
【问题描述】:

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

数据如下:

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

有人知道如何进行这项工作吗?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 请考虑对此添加一些解释。
      【解决方案3】:

      对于 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
      

      【讨论】:

      • 我不知道这是如何工作的,但它确实有效。惊人的!谢谢。
      • 如何用回车换行替换逗号?我尝试用 CHAR(13)+(Char10) 替换 ', ' 但它一直用“#x0D;”替换它们
      • @Osprey 请在您的查询中发布一个新问题以及您正在尝试做什么。 :)
      • 奇怪的是,我必须在所选字段前面连接一个额外的空格才能获得整个值 ' '+isNull(n5.myField1, n5.myField2) + '|'(它返回时第一个字符被截断)
      • 一个很好的答案,但运行很多行时速度极慢。 SQL Server 2017 添加了一个新函数 STRING_AGG,我们可以使用它,它比 FOR XML 快很多很多倍。我将发布一个使用 STRING_AGG 作为新答案的解决方案。
      【解决方案4】:

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

      SELECT string_agg(DISTINCT <column>,'delimiter') FROM <table> GROUP BY <column2>
      

      【讨论】:

      • string_agg 是一个 Oracle 函数;在 mssql 中不存在。
      • @MarwaAhmad STRING_AGG 不是 Oracle 函数。它是PostgreSQL one(现在是 SQL Server 2017 的 SQL Server)。
      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 2021-05-20
      • 2017-03-20
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多