GROUP BY但从其他列获取所有值

b4r*_*3kk 34 sql group-by

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

id | name
===+=====
1  | foo
1  | bar
1  | foobar
2  | foo
2  | bar
2  | foobar
Run Code Online (Sandbox Code Playgroud)

现在查询:

SELECT t.* FROM table t GROUP BY t.id
Run Code Online (Sandbox Code Playgroud)

会得到类似于这个的结果:

id | name
===+=====
1  | foo
2  | foo
Run Code Online (Sandbox Code Playgroud)

但是有可能收集所有名称的值来得到这样的结果吗?

id | name
===+=================
1  | foo, bar, foobar
2  | foo, bar, foobar
Run Code Online (Sandbox Code Playgroud)

Adr*_*der 39

使用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])
Run Code Online (Sandbox Code Playgroud)

就像是

SELECT ID, GROUP_CONCAT(name) GroupedName
FROM Table1
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle DEMO


a_h*_*ame 16

对于Postgres使用 string_agg()

select id, 
       string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要一个数组而不是一个字符串,你可以使用 `array_agg`。见 /sf/answers/911810021/ (3认同)

him*_*056 16

对于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;
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

SELECT ID, STRING_AGG (name, ', ') AS Name
FROM Table1
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

看到这个SQLFiddle