#1 Tue 13 August 2013 21:26
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
|PostgreSQL] concaténer des valeurs uniques d'un champ
Bonjour,
j'ai cherché en vain comment écrire cette requête alors une fois de plus, je fais appel à vous.
J'ai une table matable (id, zone, statut) dont un extrait peut être
id zone statut
1 N, U bon
2 U bon
3 A, U mauvais
4 Ah, N bon
5 Ah, N bon
L'utilisation de string_agg
Code:
select statut, string_agg(distinct zone, ',' order by zone) as zone from matable group by statut
me donne comme résultat
statut zone
mauvais A, U
bon Ah, N, N, U, U
Or ce que j'aurais souhaité, c'est récupérer de façon unique les valeurs contenues dans le champ zone (séparées par des virgules). Dit plus clairement, par ex pour le statut "bon", je voudrais avoir comme valeur (Ah, N, U). Je n'arrive pas à trouver comment scinder le contenu du champ "zone" pour les traiter individuellement.
Si quelqu'un a des idées de piste, je prends.
Merci...
Hors ligne
#2 Wed 14 August 2013 02:24
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: |PostgreSQL] concaténer des valeurs uniques d'un champ
Salut,
ta requête ne renvoie pas le bon résultat parce que l'expression d'agrégat travaille avec les chaines renvoyées par le group by (en l'occurrence 'Ah, N' ,'N', 'N, U' pour le statut 'bon') et ne peut distinguer les "valeurs" qu'elles contiennent.
Il faut que tu explose au préalable ton champ zone afin d'en extraire tes valeurs.
Voici un exemple de code :
Code:
WITH tab AS ( SELECT statut, string_to_array( string_agg(zone, ','), ',') as zone FROM testagg GROUP BY statut), unq AS ( SELECT DISTINCT statut, btrim(unnest(zone), ' ') AS zone FROM tab order by zone) SELECT statut,string_agg(zone,', ') as zone FROM unq GROUP BY statut
la sous requête tab s'occupe de transformer les chaines en tableau (une valeur = un élément du tableau).
unq explose ce même tableau en lignes en joignant le statut et en ne gardant que les occurrences distinctes.
la requête principale ré-agrège le résultat de unq.
PS: le premier qui fait une blague sur mes origines je le descends.
Dernière modification par tumasgiu (Wed 14 August 2013 16:12)
Hors ligne
#3 Wed 14 August 2013 16:27
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: |PostgreSQL] concaténer des valeurs uniques d'un champ
Bonjour,
Génial! C'est bien ce que je voulais. A part btrim, j'ai essayé toutes ces fonctions hier (et bien d'autres concernant les tableaux) mais sans jamais trouver la bonne combinaison pour exploser préalablement mon champ et le recomposer afin d'aboutir au bon résultat.
Merci beaucoup, Tumasgiu!
Hors ligne