SQL查询在SQL Server中以逗号分隔符的形式获取聚合结果

时间:2011-06-14 14:15:49

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

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

我的表格将采用以下格式

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

预期结果应采用以下格式

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

2 个答案:

答案 0 :(得分:23)

您想使用FOR XML PATH construct:

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 :(得分:0)

只是为了一个平衡的视图,你也可以用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