【问题标题】:SQL Query to get aggregated result in comma separators along with group by column in SQL ServerSQL Query 以逗号分隔符获取聚合结果以及 SQL Server 中的按列分组
【发布时间】:2011-09-14 18:07:33
【问题描述】:

我需要在表上编写一个 sql 查询,以便结果将按列分组以及带有逗号分隔符的聚合列。

我的表格将采用以下格式

   |`````````|````````|
   |    ID   |  Value |
   |_________|________|
   |    1    |   a    |
   |_________|________|
   |    1    |   b    |
   |_________|________|
   |    2    |   c    |
   |_________|________|

预期结果应为以下格式

   |`````````|````````|
   |    ID   |  Value |
   |_________|________|
   |    1    |  a,b   |
   |_________|________|
   |    2    |   c    |
   |_________|________|

【问题讨论】:

  • 在 MySQL 中,您将使用 GROUP_CONCAT。有关如何在 SQL Server 中模拟的示例,请参阅此问题:stackoverflow.com/questions/451415/…
  • 正如@Eric Petroelje 所说,+1 on cross apply。这是实现它的方法。

标签: sql sql-server select aggregate-functions sql-server-group-concat


【解决方案1】:

你想使用FOR XML PATH 构造:

select 
    ID, 
    stuff((select ', ' + Value 
           from YourTable t2 where t1.ID = t2.ID 
           for xml path('')),
          1,2,'') [Values]
from YourTable t1
group by ID

STUFF的作用是去掉前面的', '

您还可以在此处查看其他示例:

【讨论】:

  • +1 为您的解决方案。同样,我们也可以使用交叉应用来做到这一点。哪一种是性能方面的最佳方式?
  • 接受了答案,但需要执行操作的最佳方式。
【解决方案2】:

只是为了平衡的观点,您也可以使用 CTE 执行此操作,但它不如我认为的交叉应用方法好。我已经编码了这个蹄子,如果它不起作用,请道歉。

WITH CommaDelimitedCTE (RowNumber,ID,[Value],[Values]) AS
(
  SELECT 1,MT.ID , MIN(MT.Value), CAST(MIN(MT.Value) AS VARCHAR(8000)) 
  FROM  MyTable MT
  GROUP BY MT.ID

  UNION ALL

  SELECT CT.RowNumber + 1, MT.ID, MT.Value, CT.[Values] + ', ' + MT.Value
  FROM  MyTable MT
  INNER JOIN CommaDelimitedCTE CT ON CT.ID = MT.ID
  WHERE MT.[Value] > CT.[Value]
)

Select CommaDelimitedCTE.* from CommaDelimitedCTE 
    INNER JOIN (SELECT MT.ID,MAX(RowNumber) as MaxRowNumber from CommaDelimitedCTE GROUP BY MT.ID) Q on Q.MT.ID = CommaDelimitedCTE.MT.ID
    AND Q.MaxRowNumber = CommaDelimitedCTE.RowNumber

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2021-11-17
    相关资源
    最近更新 更多