IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Concaténation avec Group by


Sujet :

PostgreSQL

  1. #1
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut Concaténation avec Group by
    Bonjour,

    Je me demandais s'il existait une fonction "agrégat" (style SUM, AVG) qui me permettrait de concaténer les résultats d'une requête utilisant un GROUP BY.

    Par exemple : concaténer les noms de villes où ont habité chaque personne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT nom, FONCTION(ville)
    FROM personne
    GROUP BY nom
    Et ça retounerait des rows du style :

    'MonsieurX' 'Paris, Bruxelles, Madrid'
    'MonsieurY' 'New York'

    Il me faudrait donc une fonction qui permette de mettre un séparateur entre chaque valeur. J'ai vu qu'on pouvait créer ses propres fonctions agrégat avec CREATE AGGREGATE, mais si je pouvais m'en passer, ça serait pas mal.

    (Ma vraie requête n'est pas celle là, mais j'ai essayé de simplifier)

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Salut,
    tu peux essayer ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE OR REPLACE FUNCTION agg_virgule(text, text)
      RETURNS text AS
    $BODY$
    BEGIN
     IF $2 IS NULL THEN
      return $1;
     END IF;
     IF LENGTH($1)>0 THEN
      IF position($2 in $1)=0 THEN
       return $1;
      ELSE
       return $1||','||$2;
      END IF;
     ELSE
      return $2;
     END IF;
    END;$BODY$
      LANGUAGE 'plpgsql';
     
    CREATE AGGREGATE aggvirgule(
      BASETYPE=text,
      SFUNC=agg_virgule,
      STYPE=text
    );
    tu es obligé de passer par un aggrégat quand il y a group by.
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Bonsoir,

    Merci beaucoup pour cette fonction, c'est exactement ce que je voulais.

    Il y avait une petite erreur, je pense pour un IF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      IF position($2 in $1) <> 0 THEN
       return $1;
    Encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténation avec Group By
    Par HelpJulien dans le forum QlikView
    Réponses: 2
    Dernier message: 16/02/2012, 15h52
  2. Opérateur de concaténation avec GROUP BY
    Par kamaxime dans le forum Access
    Réponses: 2
    Dernier message: 26/04/2006, 15h14
  3. Prb. avec group by
    Par bianconeri dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 14h01
  4. requête avec group by
    Par Staron dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/11/2004, 16h30
  5. update avec group by
    Par slc dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo