FIREBIRD - Problème LEFT JOIN

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 7 mars 2013 à 17:40
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 8 mars 2013 à 10:32
Bonjour,

Pour situer le problème, j'ai deux tables :
STOCKS (NUM_STK, NUM_PROD, QTE)
ETATS (NUM_STK, NUM_ETAT, NUM_PROD, QTE)

STOCKS est un état du stock en temps réel. Le stock peut être réparti sur plusieurs lieux de stockage (NUM_STK)
ETATS permet de conserver un état du stock à un moment donné.

Dans STOCKS, j'ai plusieurs produits sur 6 sites (un même produit peut être présent sur plusieurs sites). J'enregistre mon état. J'ai bien mes 6 sites et tous mes produits par site.
Je veux contrôler, suite à l'enregistrement d'un état, que les 6 sites de stockage du stock actuel sont bien dans l'état. Pour les besoins du test, j'efface donc dans l'état enregistré le site 3.

J'ai essayé cette requête (essai sur l'état n°2):
Select distinct t1.NUM_STK, Count(distinct t1.NUM_STK) as C1, Count(distinct t2.NUM_STK) as C2
From STOCKS t1
LEFT JOIN (ou LEFT OUTER) ETATS t2 on t1.NUM_STK = t2.NUM_STK
Where t2.NUM_ETAT = 2
Group by t1.NUMSTK

En retour, j'ai :
NUM_STK | C1 | C2
1 1 1
2 1 1
4 1 1
5 1 1
6 1 1

Pas de site 3 !!! Je m'attendais à avoir une ligne 3, 1, 0

Je fais donc cette requête :
Select distinct t1.NUM_STK, Count(distinct t1.NUM_STK),
(Select Count(distinct t2.NUM_STK)
From ETATS t2
Where t1.NUM_STK = t2.NUM_STK
and t2.NUM_ETAT = 2)
From Stocks t1
Group by t1.NUM_STK

En retour, j'ai le résultat souhaité :
NUM_STK | C1 | C2
1 1 1
2 1 1
3 1 0
4 1 1
5 1 1
6 1 1

Je voudrais juste comprendre pourquoi le left join ne marche pas...


Simon

2 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
7 mars 2013 à 21:02
Salut,

il me semble que la valeur NULL dans un count() fait perdre la ligne complète
(la valeur d'agrégation ne peut pas etre nulle ou un message du genre)
car sinon, c'est comme si tu faisait : Count(distinct NULL)

dans ta première requete, peut etre qu'un :
select distinct 
    t1.NUM_STK, 
    Count(distinct t1.NUM_STK) as C1,
    C2  = Count(distinct isnull(t2.NUM_STK,0)) /*<----- ICI*/
from /*...*/

permettrait de réparer, a voir.

bye...
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 mars 2013 à 10:32
Merci yann_lo_san,
malheureusement, c'est sans effet...
J'ai essayé avec nullif et coalesce...

Simon
0
Rejoignez-nous