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 :

Besoin de retrouner des 0 aussi dans une requête SQL avec JOIN


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Besoin de retrouner des 0 aussi dans une requête SQL avec JOIN
    Salut à toutes et à tous,

    J'essaye d'écrire une requête pour me sortir un comptage d'élément dans une table intermédaire qui crée un lien n-n entre 2 tables.

    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur", count("TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID") AS "NbrPP"
    FROM "TblIntermediairePPSecteurs"
    JOIN "TblSecteurs" ON "TblSecteurs"."TblSecteurs_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_SecteurID"
    JOIN "TblPP" ON "TblPP"."TblPP_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID"
    WHERE "TblPP"."TblPP_Graphique" = true
    GROUP BY "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur"
    ORDER BY "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur";
    Cette requête fonctionne presque comme je le voudrais.

    Elle me retourne, par exemple :

    TblSecteurs_NumMandat| TblSecteurs_NumSecteur | NbrPP
    -------------------------------------------------------------------
    2791 | 2 | 12
    2791 | 3 | 7
    2791 | 4 | 3
    2791 | 5 | 1
    2791 | 6 | 2
    2791 | 7 | 3
    2791 | 9 | 1
    2791 | 10 | 2

    Remarquez qu'il n'y a pas de ligne 1 ni de ligne 8.
    Normal me direz-vous, puisqu'il n'y a pas de ligne reprenant son Id dans le champs TblIntermediairePPSecteurs_PPID de la table TblIntermediairePPSecteurs.
    Oui bien sur, mais c'est que j'aurais besoin de ces 0.

    J'ai bien essayé cette requête mais elle me donne exactement la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur", coalesce(count("TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID"),0) AS "NbrPP"
    FROM "TblIntermediairePPSecteurs"
    JOIN "TblSecteurs" ON "TblSecteurs"."TblSecteurs_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_SecteurID"
    JOIN "TblPP" ON "TblPP"."TblPP_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID"
    WHERE "TblPP"."TblPP_Graphique" = true
    GROUP BY "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur"
    ORDER BY "TblSecteurs"."TblSecteurs_NumMandat", "TblSecteurs"."TblSecteurs_NumSecteur";
    J'espérais que le coalesce me retournerait un 0 mais il semble que le problème vienne du GROUP BY. toutefois je ne vois pas comment résoudre le pbl, aussi je fais appel à votre ingéniosité pour m'aider.

    J'ai bien entendu aussi essayer de remplacer les JOIN par des RIGHT OUTER JOIN ou par des RIGHT JOIN mais ça n'a rien donné de différent.

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Re-salut à toutes et à tous,

    J'ai un peu évolué dans ma recherche, mais je n'ai toujours pas la solution.

    Ce code fonctionne et me retourne les 0 là où il les faut mais il est incomplet donc il ne me donne pas la bonne solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur", COUNT("TblIntermediairePPSecteurs_PPID") AS NbrPP 
    FROM "TblSecteurs"
      LEFT JOIN "TblIntermediairePPSecteurs" ON ("TblIntermediairePPSecteurs_SecteurID" = "TblSecteurs_ID")
      LEFT JOIN "TblPP" ON ("TblIntermediairePPSecteurs_PPID" = "TblPP_ID")
    GROUP BY "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur"
    ORDER BY "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur"
    En effet il y manque la clause WHERE "TblPP_Graphique"=True
    Le résultat est donc que les secteurs contenant 0 sont affichés, mais que le count n'est pas correct.

    Une fois cette clause ajoutée pour former ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur", COUNT("TblIntermediairePPSecteurs_PPID") AS NbrPP 
    FROM "TblSecteurs"
      LEFT JOIN "TblIntermediairePPSecteurs" ON ("TblIntermediairePPSecteurs_SecteurID" = "TblSecteurs_ID")
      LEFT JOIN "TblPP" ON ("TblIntermediairePPSecteurs_PPID" = "TblPP_ID")
    WHERE "TblPP_Graphique"=TrueGROUP BY "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur"
    ORDER BY "TblSecteurs_NumMandat", "TblSecteurs_NumSecteur"
    Les count sont corrects mais les secteurs contenant 0 ont diparu.

    Comment résoudre ce problème ?

    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    Tu dois pouvoir t'en sortir en utilisant la fonction generate_series qui créera une séquence de x valeurs (par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT i FROM generate_series(1, 10) AS i;
    affichera 10 lignes contenant un entier allant de 1 à 10.

    En utilisant cette « table virtuelle », tu dois pouvoir résoudre ton problème.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de ta proposition.

    J'ai aussi trouvé une solution que je donne ici, au cas où elle servirait à quelqu'un :
    J'ai utilisé un coalesce mais il faut l'utiliser dans la clause where et non dans le select. En effet, dans le select cela ne peut rien retourner puisque l'élément est éliminé par le where avant d'atteindre le select.
    En mettant le coalesce dans le where pour qu'il retourne une valeur et qu'il passe le where, cela fonctionne très bien.
    Dans mon cas, il s'agissait de compter des points liés à des secteurs via une table intermédiaire qui crée une relation n-n entre les tables de points et de secteurs.
    Il fallait compter le nombre de points dans chaque secteur.
    Si un secteur ne contient aucun point, il n'y a biensur aucune ligne contenant ce secteur dans la table intermédiaire. Il est donc impossible de tester les points de ce secteur pour voir si leur clause graphique (ce que je teste dans le where) est à True ou à False.
    J'ai donc mis le coalesce dans le where pour qu'il retourne un True (ceux qui passent le where) pour les points qui retournent un null. Une fois que le where est passé de la sorte, le count retourne un 0 et le secteur est donc bien affiché avec une valeur 0 au lieu de ne plus être retourné par la requête.

    En résumé, et peut-être un plus clair voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT "TblSecteurs"."TblSecteurs_ID" AS "NbrPPParSecteurs_SecteurID", count("TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID") AS "NbrPPParSecteurs_NbrPPParSecteur", 
         CASE "TblSecteurs"."TblSecteurs_NbrLots"
             WHEN 0 THEN 0::numeric
             ELSE count("TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID")::numeric / "TblSecteurs"."TblSecteurs_NbrLots"
         END AS "NbrPPParSecteur_PourcentagePPParSecteur"
    FROM "TblSecteurs"
      LEFT JOIN "TblIntermediairePPSecteurs" ON "TblSecteurs"."TblSecteurs_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_SecteurID"
      LEFT JOIN "TblPP" ON "TblPP"."TblPP_ID" = "TblIntermediairePPSecteurs"."TblIntermediairePPSecteurs_PPID"
    WHERE COALESCE("TblPP"."TblPP_Graphique", true) = true
    GROUP BY "TblSecteurs"."TblSecteurs_ID", "TblSecteurs"."TblSecteurs_NbrLots"
    ORDER BY "TblSecteurs"."TblSecteurs_ID";
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

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

Discussions similaires

  1. Gestion des dbparameters vides dans une requête SQL
    Par GCAccess dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/10/2009, 08h48
  2. Exclure des enregistrements vide dans une requête sql
    Par beegees dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/03/2009, 19h42
  3. Insérer des champs vides dans une requête sql
    Par js8bleu dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/02/2008, 15h00
  4. [SQL] insérer des variables php dans une requête sql
    Par lili38 dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 22/06/2007, 16h38
  5. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29

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