2014-04-18 3 views
0

J'ai 3 tables produits, Ordre, Order_Placedjointure gauche donnant un résultat erroné

Products---------- Order---------------- Order_Placed 
________________________________________________________ 
prod_id | -------| order_id | -------| prod_id |order_id| 

1000----------------2001-------------------1000|2001 


1001----------------2002-------------------1000|2002 

1002--------------- 2003------------------1001|2001 

Donc ma question est quelque chose comme ceci:

select P.Prod_ID, COUNT(*) 
from PRODUCTS P 
LEFT JOIN ORDER_PLACED OP 
ON P.PROD_ID= OP.PROD_ID 
group by .... 

résultat aussi devrait être:

Prod_Id Count(*) 

1001  2 

1002  1 

1003  0 

Répondre

2

Non. count(*) ne peut jamais retourner 0. Soit il ne retourne rien (pas de ligne du tout) ou au moins 1.

Vous voulez:

select P.Prod_ID, COUNT(OP.PROD_ID) 
from PRODUCTS 
LEFT JOIN ORDER_PLACED OP 
ON P.PROD_ID= OP.PROD_ID 
group by .... 

REMARQUE:

Il y a eu une tentative d'ajouter un qualificatif à ma réponse. Mais count(*) ne peut pas retourner 0 dans toute situation avec un group by. Un zéro signifierait qu'il n'y a pas de lignes dans le groupe. Et cela à son tour signifierait qu'il n'y a pas de lignes dans la sortie. Lorsque aucune ligne n'est sélectionnée pour une agrégation globale, elle peut renvoyer 0.

+0

Merci d'avoir répondu .... Y a-t-il un autre moyen d'obtenir le compte zéro? – Hitesh

+1

Il vous a dit le chemin. Au lieu de COUNT (*), qui compte les lignes, utilisez COUNT (op.prod_id), qui compte les valeurs op.prod_id non nuls. Cela fonctionne car dans le LEFT JOIN, op.prod_id sera NULL s'il n'y a pas de ligne order_placed correspondante. – Frazz

+0

yup a obtenu .... merci à vous tous les gars – Hitesh