PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Concatenar várias linhas de resultados de uma coluna em uma, agrupar por outra coluna


Mais simples com a função agregada string_agg() (Postgres 9.0 ou posterior):
SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

O 1 em GROUP BY 1 é uma referência posicional e um atalho para GROUP BY movie nesse caso.

string_agg() espera o tipo de dados text como entrada. Outros tipos precisam ser convertidos explicitamente (actor::text ) - a menos que uma conversão implícita para text está definido - que é o caso de todos os outros tipos de caracteres (varchar , character , "char" ), e alguns outros tipos.

Como isapir comentou, você pode adicionar um ORDER BY cláusula na chamada agregada para obter uma lista classificada - caso você precise disso. Como:
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

Mas normalmente é mais rápido classificar linhas em uma subconsulta. Ver:
  • Postgres SQL - Criar matriz em seleção