用于合并具有公共ID的行的SQL命令?

时间:2014-01-28 19:30:41

标签: sql ms-access

我有一张表格如下:

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

3 个答案:

答案 0 :(得分:0)

您没有提到您正在使用哪个DBMS,但在MySQL中它非常简单:

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

在SQL Server中,它有点棘手。我通常看到的解决方案要求您使用FOR XML PATH。你可以找到一篇关于如何做到这一点的好文章here

答案 1 :(得分: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

答案 2 :(得分: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