53

我将在示例中解释我需要做什么。首先,我们有一个像这样的简单表,名为table

id | name
===+=====
1  | foo
1  | bar
1  | foobar
2  | foo
2  | bar
2  | foobar

现在查询:

SELECT t.* FROM table t GROUP BY t.id

将得到与此类似的结果:

id | name
===+=====
1  | foo
2  | foo

但是是否有可能收集name的所有值以获得这样的结果?

id | name
===+=================
1  | foo, bar, foobar
2  | foo, bar, foobar
4

4 回答 4

61

使用 MySQL,您可以使用GROUP_CONCAT(expr)

此函数返回一个字符串结果,其中包含来自组的串联非 NULL 值。如果没有非 NULL 值,则返回 NULL。完整的语法如下:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

就像是

SELECT ID, GROUP_CONCAT(name) GroupedName
FROM Table1
GROUP BY ID

SQL 小提琴演示

于 2013-09-20T06:26:44.227 回答
22

对于 SQL Server(2017 年之前FOR XML)使用子句和STUFF()函数:

SELECT distinct id, name = 
    STUFF((SELECT ' , ' + name
           FROM Table1 b 
           WHERE b.id = a.id 
          FOR XML PATH('')), 1, 2, '')
FROM Table1 a
GROUP BY id;

更新

使用 SQL Server 2017,您可以简单地使用STRING_AGG()函数来实现:

SELECT ID, STRING_AGG (name, ', ') AS Name
FROM Table1
GROUP BY ID

看到这个 SQLFiddle

于 2013-09-20T06:39:43.617 回答
20

对于 Postgres 使用string_agg()

select id, 
       string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
于 2013-09-20T06:34:54.110 回答
1

如果您使用的是 db2,则以下查询适用于您:

SELECT DISTINCT id, LISTAGG(names, ',')
FROM tb
GROUP BY id;
于 2021-03-03T18:40:12.410 回答