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

Langage SQL Discussion :

GROUP BY et aggrégats NULL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 18
    Points
    18
    Par défaut GROUP BY et aggrégats NULL
    Bonsoir,

    Je cherche la manière correcte d'obtenir une sélection sur 2 tables liées comportant un champ groupé, mais en conservant les cas où il peut être NULL. La base utilisée est PgSQL 9.1.

    Voici un schéma et des données :

    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
    CREATE TABLE "table_ref" (
    	id INTEGER primary key);
    CREATE TABLE "table_mesure" (
    	id INTEGER primary key,
    	fk INTEGER REFERENCES "table_ref" (id),
    	Type VARCHAR,
    	Valeur NUMERIC);
     
    INSERT INTO "table_ref" (id) VALUES 
    	(1),(2),(3),(4);
    INSERT INTO "table_mesure" (id, fk, Type, Valeur) VALUES
    	(1,1,'Hauteur',15),
    	(2,1,'Longueur',25),
    	(3,2,'Hauteur',10),
    	(4,2,'Longueur',10),
    	(5,2,'Largeur',10),
    	(6,3,'Hauteur',10);
    Voici la requête utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      a.id,
      COALESCE((array_to_string(ARRAY(SELECT unnest(array_agg(b.Type|| ' : ' || b.Valeur))),'; ')), 'vide') AS mesures 
    FROM 
      "table_ref" AS "a",
      "table_mesure" AS "b"
    WHERE
      a.id = b.fk
    GROUP BY a.id;
    Le résultat est :

    id |mesures
    1 |"Hauteur : 15; Longueur : 25"
    2 |"Hauteur : 10; Longueur : 10; Largeur : 10"
    3 |"Hauteur : 10"

    Alors que je voudrais garder tous les a.id, cf. :

    id |mesures
    1 |"Hauteur : 15; Longueur : 25"
    2 |"Hauteur : 10; Longueur : 10; Largeur : 10"
    3 |"Hauteur : 10"
    4 |"vide"

    Cdlt,
    Nafai

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Merci, je ne connaissais pas ce type de jointure

    la bonne requête était donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
      a.id,
      array_to_string(ARRAY(SELECT unnest(array_agg(b.Type|| ' : ' || b.Valeur))),'; ') AS mesures 
    FROM "table_ref" AS "a"
    LEFT OUTER JOIN "table_mesure" AS "b" ON  a.id = b.fk
    GROUP BY a.id;

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je pense que vous utilisez trop de fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        SELECT a.id
             , array_to_string(array_agg(b.Type|| ' : ' || b.Valeur order by b.id asc), '; ') AS mesures
          FROM table_ref    AS a
     LEFT JOIN table_mesure AS b
            ON b.fk = a.id
      GROUP BY a.id
      ORDER BY a.id asc;
     
    Id   Mesures
    ---- -----------------------------------------
    1    Hauteur : 15; Longueur : 25
    2    Hauteur : 10; Longueur : 10; Largeur : 10
    3    Hauteur : 10
    4

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 18
    Points
    18
    Par défaut
    Effectivement, moins de fonctions pour le même résultat, je prend ! Merci

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

Discussions similaires

  1. [Graphique] Groupe hiearchique supprimer valeur nulles
    Par joketor dans le forum QlikView
    Réponses: 9
    Dernier message: 18/06/2014, 17h50
  2. GROUP BY et affichage valeurs null
    Par zxr96 dans le forum SQL
    Réponses: 5
    Dernier message: 18/06/2008, 11h43
  3. GROUP BY sur "NULL"
    Par alfredmobile dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/02/2008, 05h35
  4. creer un groupe avec le reste des valeurs nulles
    Par aurelie83 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 03/01/2008, 14h32
  5. Sommes, Group by et valeurs nulles
    Par antonomase dans le forum SQL
    Réponses: 11
    Dernier message: 23/11/2006, 20h33

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