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 :

2 Count() sur deux tables en jointures gauches


Sujet :

Langage SQL

  1. #1
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut 2 Count() sur deux tables en jointures gauches
    Bonjour,

    J'ai recherché vainement dans le forum une astuce pour compter des éléments de deux tables en jointure gauche à une table principale. Malheureusement, mes comptes se multiplient entre eux. Un exemple sera plus parlant

    J'ai une table panier, une table pomme et une table poire.
    Dans mon panier, je peux avoir 0 à n Pommes ET/OU 0 à n Poires

    Je veux connaitre pour mes paniers, leur clef informatique (clef primaire) et le nombre de pommes et de poires qu'il contiennent.

    J'avais faussement pensé pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      SELECT panier.id_panier,
            count(pomme.id_pomme), 
            count(poire.id_poire)
       FROM panier,poire,pomme
      WHERE panier.id_panier = poire.id_panier (+)
        AND panier.id_panier = pomme.id_panier (+)
    GROUP BY panier.id_panier
    soit (je viens de l'éditer suite à la remarque du post suivant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      SELECT panier.id_panier,
            count(pomme.id_pomme), 
            count(poire.id_poire)
       FROM panier
        LEFT OUTER JOIN pomme on panier.id_panier = pomme.id_panier 
        LEFT OUTER JOIN poire on panier.id_panier = poire.id_panier 
    GROUP BY panier.id_panier
    Malheureusement dans le panier 1 j'ai 3 pommes et 2 poires.
    J'obtiens logiquement 6 pommes et 6 poires en réponse ! (3*2)
    C'est logique, j'ai 6 lignes retournées.

    Alors en regardant la doc sqlpro, j'ai tenté cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      SELECT panier.id_panier,
             SUM(CASE WHEN pomme.id_pomme > 0  THEN 1  ELSE 0 END), 
             SUM(CASE WHEN poire.id_poire > 0  THEN 1  ELSE 0 END), 
       FROM panier,poire,pomme
      WHERE panier.id_panier = poire.id_panier 
        AND pomme.id_panier = poire.id_panier
    GROUP BY panier.id_panier
    Le principe était que si il y avait une pomme je sommais 1 (0 en cas de non présence) et si il y avait une poire ca donnait 1 et 0 sinon. Algorithmiquement, ca me semblait juste, mais cela me retourne exactement la même valeur : 6.

    Auriez vous un moyen de compter le nombre de pommes et de poires en jointure gauche. (Les jointures sont ainsi car les paniers vides, ou les paniers n'ayant qu'un type de fruit doivent rentré dans ma table).
    Autre subtilité, j'ai bien pensé à utiliser deux requêtes, mais techniquement, pour raisons diverses, je ne peux pas ! (même si je le voulais)

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Moi je ferais une jointure c'est plus à la norme (si ton SGBD le permet)
    ensuite il faut utiliser distinct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  PANIER.ID, COUNT( distinct POMME.ID ) Nombre_d_ID_Pomme , COUNT( distinct POIRE.ID ) Nombre_d_ID_poire
    FROM PANIER
       LEFT OUTER JOIN POIRE ON (PANIER.ID = POIRE.IDPANIER)
       LEFT OUTER JOIN POMME ON (PANIER.ID = POMME.IDPANIER)
    GROUP BY PANIER.ID

  3. #3
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Je te prie de m'excuser l'ai oublié les (+) dans mon code. Une erreur de recopie. Je parlais de jointures gauches en effet.

    Et ta solution corrige bien mon erreur. Merci pour le distinct
    PS : Mon SGBD est Oracle

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

Discussions similaires

  1. jointure sur deux table
    Par mioke dans le forum SAS Base
    Réponses: 10
    Dernier message: 13/03/2008, 16h24
  2. [Requête] Jointure sur deux tables.
    Par Invité dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/11/2007, 11h36
  3. Jointure sur deux tables
    Par shinji_rem dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/04/2007, 10h18
  4. requête count sur deux tables
    Par psychoBob dans le forum Requêtes
    Réponses: 7
    Dernier message: 13/06/2006, 15h12
  5. Jointures sur deux tables
    Par spirou dans le forum Requêtes
    Réponses: 6
    Dernier message: 31/05/2006, 15h46

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