PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Pb Count(*)
Pb Count(*)
Débuté par GRM, 22 déc. 2006 20:00 - 2 réponses
Posté le 22 décembre 2006 - 20:00
Bonjour,

J'effectue la requete suivante :

SELECT
CONTRAT.IDCONTRAT AS IDCONTRAT,
COUNT(*) AS nbPub
FROM
CONTRAT,
PUB,
ENTREPRISE
WHERE
CONTRAT.IDCONTRAT = PUB.IDCONTRAT
GROUP BY
CONTRAT.IDCONTRAT,

Le problème c'est que si il n'y a pa de pub pour un contrat alors le count (*) ne me renvoi pas 0.

Avez vous eu déjà ce problème ? Et si oui avez vous une solution ?


GRM
Posté le 23 décembre 2006 - 19:06
bonjour,

1/ la presence du fichier ENTREPRISE dans la requete semble inutile
2/ la clause : WHERE CONTRAT.IDCONTRAT = PUB.IDCONTRAT

implique une equijointure entre les fichiers CONTRAT et PUB c'est à dire que seuls les contrats avec pub seront renvoyés par la requete

>> je suppose cardinalites de type 0,n - 1,1 entre CONTRAT et PUB

3/ donc pour avoir tous les contrats même sans pub il faut une jonture externe gauche entre CONTRAT et PUB

CONTRAT LEFT OUTER JOIN PUB ON CONTRAT.IDCONTRAT = PUB.IDCONTRAT

4/ dans ce cas la valeur renvoyés n'est pas 0 mais NULL (normalement)

5/ j'ai fait un test et le resultat attendu ci dessus marche bien avec les fonction d'aggrégation comme SUM, AVG, MAX, MIN

MAIS J'AI REMARQUE QUE MON TEST (WD11-035c) renvoie la valeur 1 pour la fonction Count(*) cela m'a également surpris car je m'attendant à NULL

pour contourner ce pb , je cous propose d'effectuer un SUM sur une valeur comme le montant des pub (s'il existe) puis en parcourant le résultat de la requête , testez si vous avez NULL alors NbPub = 0

bon courage

JM
Posté le 23 décembre 2006 - 19:06
Bonjour.
Si cette requete est exécutée en code, vous pouvez tester l'existence d'une ligne:
avec un HNbEnr, ou un test avec HEnDehors.

Michel, Montréal