PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Concaténer plusieurs lignes de résultats d'une colonne en une seule, grouper par une autre colonne

Plus simple avec la fonction d'agrégation string_agg() (Postgres 9.0 ou version ultérieure) :

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

Le 1 dans GROUP BY 1 est une référence de position et un raccourci pour GROUP BY movie dans ce cas.

string_agg() attend le type de données text comme entrée. Les autres types doivent être castés explicitement (actor::text ) - sauf si un transtypage implicite en text est défini - ce qui est le cas pour tous les autres types de caractères (varchar , character , "char" ), et quelques autres types.

Comme isapir l'a commenté, vous pouvez ajouter un ORDER BY clause dans l'appel agrégé pour obtenir une liste triée - si vous en avez besoin. Comme :

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

Mais il est généralement plus rapide de trier les lignes dans une sous-requête. Voir :

  • Postgres SQL - Créer un tableau dans Select