GROUP BY, но получить все значения из другого столбца

Я объясню, что мне нужно сделать, например. Прежде всего, у нас есть простая таблица, подобная этой, с именем 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

Но возможно ли, чтобы все значения имени имели такой результат?

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

Ответ 1

С помощью 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 Fiddle DEMO

Ответ 2

Для Postgres используйте string_agg()

select id, 
       string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;

Ответ 3

Для SQL Server используйте 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;

См. этот SQLFiddle