188 votes

Concaténation de plusieurs lignes de résultats d'une colonne en une seule, groupée par une autre colonne.

J'ai un tableau comme celui-ci

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

Je veux obtenir le nom d'un film et tous les acteurs de ce film, et je veux que le résultat soit dans un format comme celui-ci :

Movie   ActorList
 A       1, 2, 3

Comment puis-je le faire ?

331voto

Erwin Brandstetter Points 110228

Plus simple avec la fonction d'agrégation string_agg() (Postgres 9.0 ou plus récent) :

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

El 1 en GROUP BY 1 est une référence positionnelle 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 convertis explicitement ( actor::text ) - sauf si un transfert implicite vers text est définie - ce qui est le cas pour tous les autres types de chaînes ( varchar , character , name ...) et d'autres types.

Comme isapir a commenté vous pouvez ajouter un ORDER BY dans l'appel à l'agrégat 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 :

76voto

hims056 Points 13538

Vous pouvez utiliser array_agg pour cela :

SELECT "Movie",
array_to_string(array_agg(distinct "Actor"),',') AS Actor
FROM Table1
GROUP BY "Movie";

Résultat :

CINÉMA

ACTEUR

A

1,2,3

B

4

Ver ce SQLFiddle

Pour plus d'informations, voir 9.18. Fonctions agrégées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X