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 :

COUNT et jointure externe


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut COUNT et jointure externe
    Bonjour,

    Je travaille actuellement sur un projet ou 2 tables 'Produit' et 'Contrat', liées par une clé secondaire dans 'Contrat' et j'essaye d'obtenir une table comprenant tous les champs de ces deux tables, mais également le nombre de contrats liés à chaque produit.

    Je travaille sur Windev, avec du MySQL

    Voila la structure des tables :

    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
    CREATE TABLE Produit
    (
    IdProduit,
    NomProduit,
    Prix,
    PRIMARY KEY (IdProduit)
    );
     
    CREATE TABLE Contrat
    (
    IdContrat,
    IdProduit,
    DateContrat,
    PRIMARY KEY (IdContrat),
    FOREIGN KEY (IdProduit) REFERENCES Produit(IdProduit)
    );

    Le resultat que j'aimerai obtenir est du type

    NomProduit     l     Prix      l     nbContrats
    --------------------------------------------
    LogiBat          l     200€     l       4
    EducaCiel       l     150€     l       3
    Softobinz       l     300€     l       0
    DevServeur    l     100€     l       0
    La premiere requête que j'ai testée pose un probleme au niveau de la jointure entre les tables : les produits qui ne sont pas liés a un contrat n'apparaissent pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT Produit.IDProduit, Produit.NOMPRODUIT, Produit.PRIX, COUNT(*) AS NBCONTRATS 
        FROM Produit, Contrat 
       WHERE Produit.idproduit=contrat.idproduit
    GROUP BY IDPRODUIT, NOMPRODUIT, PRIX

    Apres quelques recherche, je me suis orienté sur les jointures externes (élément que je n'ai jamais manié auparavent)
    J'ai donc réussi a afficher les produits sans contrats, mais le COUNT ne me renvoie pas la bonne valeur pour ces produits (1 au lieu de 0):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT Produit.IDProduit, Produit.NOMPRODUIT, Produit.PRIX, COUNT(*) AS NBCONTRATS 
        FROM Produit, Contrat
             RIGHT OUTER JOIN Contrat ON Contrat.Idproduit = Produit.Idproduit
    GROUP BY IDPRODUIT, NOMPRODUIT, PRIX
    Je vois a peu pres d'ou vient le probleme (le count compte les tuples, meme si ils ne sont pas liés) mais je ne vois pas comment le résoudre.

    Si une âme charitable a une suggestion ou une piste, je suis preneur.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par Bobotaku Voir le message
    Je vois a peu pres d'ou vient le probleme (le count compte les tuples, meme si ils ne sont pas liés) mais je ne vois pas comment le résoudre.
    Tout à fait, c'est bien ce qui se passe. Mais ce n'est pas count qui compte les tuples, c'est count(*).
    Pour résoudre, on compte sur une colonne non nulle de la table jointe, un excellent choix c'est la clef primaire.
    Attention toute fois, votre jointure externe est dans le mauvaise sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT Prd.IDProduit, Prd.NOMPRODUIT, Prd.PRIX
           , COUNT(Cnt.IdContrat) AS NbContrats 
        FROM Produit as Prd
             LEFT OUTER JOIN Contrat as Cnt
               ON Cnt.Idproduit = Prd.Idproduit
    GROUP BY Prd.IDProduit, Prd.NOMPRODUIT, Prd.PRIX

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Wow ! Merci beaucoup Waldar, ça marche impec !
    ça me simplifie vraiment la vie pour le reste du code.

    Mes profs m'ont tjs dit que les 99% des COUNT sont des COUNT (*) du coup j'ai même pas réfléchi à ce parametre.

    You're the best

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

Discussions similaires

  1. Jointure externe sur "plusieurs critères" et COUNT
    Par Theophane631 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 12/08/2013, 18h51
  2. Jointure externe et Count
    Par Juli3ns dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/09/2010, 14h19
  3. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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