2014-01-28 52 views
-3

我有一個表,看起來像:SQL命令合併具有公共ID的行嗎?

Event ID Name 
1   Bob 
1   Steve 
1   Tom 
2   Bob 
3   Steve 
3   Tom 

有成千上萬的事件ID,以及幾十唯一名稱。我想一個SQL查詢到如下表返回:

Event ID Names 
1   Bob, Steve, Tom 
2   Bob 
3   Steve, Tom 

我正在尋找像SUM()AVG()聚合函數,除了它連接字符串,而不是做數學。

編輯:我卡在這一個使用MS Access。

編輯2:我意識到這在客戶端語言中是微不足道的,但我試圖看看是否可以獲得全SQL解決方案。

+2

您使用的是哪種DBMS?類似的問題發佈了[在這裏](https://stackoverflow.com/questions/15477743/listagg-in-sqlserver)。 MySQL有'GROUP_CONCAT()',MSSQL有'STUFF()',Oracle有'LISTAGG()'。 –

+0

你在說ORACLE嗎? MySQL的? SqlServer的? DB2? – jcho360

+0

在MSSQL中,這是一件很痛苦的事情,我通常最終爲連接創建一個CLR聚合。 PostgreSQL,Oracle和MySQL可以非常方便地執行此操作。 –

回答

0

你不提這DBMS您使用,但在MySQL它很容易:

SELECT EventId, GROUP_CONCAT(Names) 
FROM MyTable 
GROUP BY EventId 

在SQL Server這是一個有點棘手。我通常看到的解決方案要求您使用FOR XML PATH。你可以找到一個關於如何做到這一點的好文章here

0

如果您使用的是SQL服務器,你可以做這樣的事情

SQL Fiddle Example

WITH x AS 
    (
     SELECT event_id FROM users 
     GROUP BY event_id 
    ) 
    SELECT x.event_id, 
      name = STUFF((SELECT ',' + name 
         FROM users WHERE event_id = x.event_id 
         FOR XML PATH('')), 1, 1, '') 
    FROM x 
0

在PostgreSQL,這將是:

select EventId, string_agg(name, ',') as names 
from the_table 
group by EventId; 

如果你想在列表排序的名稱:

select EventId, string_agg(name, ',' order by name) as names 
from the_table 
group by EventId 
+0

感謝您的建議;很高興知道這在PostgreSQL中有效。 – stepthom