Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/11/2007, 21h11   #1
Nouveau Membre du Club
 
Homme
Inscription : mars 2007
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2007
Messages : 91
Points : 38
Points : 38
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 :
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 :
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
Jean-Marc68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2007, 13h56   #2
Nouveau Membre du Club
 
Homme
Inscription : mars 2007
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2007
Messages : 91
Points : 38
Points : 38
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 :
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 :
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
Jean-Marc68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2007, 18h16   #3
Membre habitué
 
Inscription : août 2007
Messages : 128
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 128
Points : 146
Points : 146
Tu dois pouvoir t'en sortir en utilisant la fonction generate_series qui créera une séquence de x valeurs (par exemple

Code :
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.
gleu_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2007, 14h45   #4
Nouveau Membre du Club
 
Homme
Inscription : mars 2007
Messages : 91
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2007
Messages : 91
Points : 38
Points : 38
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 :
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";
Jean-Marc68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h33.


 
 
 
 
Partenaires

Hébergement Web