Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 13 August 2013 21:26

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

|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: 1132

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: 3807

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

 

Pied de page des forums

Powered by FluxBB