我会在示例中解释我需要做什么。首先,我们有一个像这样的简单表,名为 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
答案 0 :(得分:38)
使用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
答案 1 :(得分:15)
对于Postgres使用string_agg()
select id,
string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
答案 2 :(得分:15)
对于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
答案 3 :(得分:0)
如果您使用的是 db2,下面的查询适用于您:
SELECT DISTINCT id, LISTAGG(names, ',')
FROM tb
GROUP BY id;