16

我需要在表上編寫一個sql查詢,以便結果中包含group by列以及帶有逗號分隔符的聚合列。SQL查詢以便在SQL Server中按逗號分隔符分組以獲得聚合結果

我的表將在下面的格式

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

預期的結果應該是在下面的格式

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

在MySQL中,你可以使用GROUP_CONCAT。有關如何在SQL Server中模擬該示例的示例,請參閱此問題:http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – 2011-06-14 14:19:01

+0

+1正如@Eric Petroelje所說的,「交叉適用」。這是做到這一點的方法。 – 2011-06-14 14:23:19

回答

22

你想用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功能是擺脫領先', '的。

您還可以在這裏看到另一個例子:

+0

+1爲您的解決方案。同樣,我們也可以使用交叉應用來完成。哪一種性能明智的最佳方式? – suryakiran 2011-06-15 03:00:34

+0

已接受答案,但需要執行該操作的最佳方式。 – suryakiran 2011-06-16 08:25:17

0

只是一個平衡的觀點,你也可以用熱膨脹係數,但它這樣做不像我認爲的交叉應用方法那麼好。如果它不起作用,我已經編碼了這個蹄。

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