sql >> Base de Datos >  >> RDS >> PostgreSQL

Concatenar múltiples filas de resultados de una columna en una, agrupar por otra columna

Más simple con la función agregada string_agg() (Postgres 9.0 o posterior):

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

El 1 en GROUP BY 1 es una referencia posicional y un atajo para GROUP BY movie en este caso.

string_agg() espera el tipo de datos text como entrada Otros tipos deben emitirse explícitamente (actor::text ) - a menos que una conversión implícita a text está definido, que es el caso para todos los demás tipos de caracteres (varchar , character , "char" ), y algunos otros tipos.

Como comentó isapir, puede agregar un ORDER BY cláusula en la llamada agregada para obtener una lista ordenada, en caso de que la necesite. Me gusta:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

Pero normalmente es más rápido ordenar filas en una subconsulta. Ver:

  • Postgres SQL - Crear matriz en Seleccionar