2009-09-24 5 views
1

J'utilise MS SQL 2008 et j'ai une table de statuts (id, name) et une table d'items (id, name, statusid, deleted).J'ai des problèmes avec SQL COUNT

Je veux compter le nombre d'éléments à chaque état, et ont la requête suivante:

SELECT status.id, 
ISNULL(COUNT (items.name), 0) AS 'count' 
FROM status 
LEFT OUTER JOIN items 
ON items.statusid = status.id 
GROUP BY status.id 

La complication est que je veux obtenir tous les états, avec un 0 s'il n'y a aucun article pour le statut. Ce qui précède fonctionne très bien pour cela, mais quand j'ajoute WHERE items.deleted = 0, il n'affiche plus les lignes avec un 0 dans les

Pourquoi la clause WHERE tue ma requête? Je soupçonne que ma méthode peut se tromper ...

Merci :)

Répondre

5
SELECT status.id, 
     COUNT (items.statusid) AS 'count' 
FROM status 
LEFT OUTER JOIN 
     items 
ON  items.statusid = status.id 
     AND items.deleted = 0 
GROUP BY 
     status.id 

Pourquoi la clause WHERE tue ma requête? Je soupçonne que ma méthode peut se tromper ...

Parce que s'il n'y a pas d'articles avec statusid donné, LEFT JOIN renvoie une ligne unique avec tous les éléments champs mis à NULL.

Votre clause WHERE filtre ces lignes (NULL = 0 renvoie NULL) et n'atteint pas le GROUP BY.

Notez également que ISNULL sur COUNT est inutile: COUNT ne renvoie jamais NULL valeurs. Il ne compte tout simplement pas NULL s, donc mettre une colonne qui fait partie d'une clause JOIN en COUNT fera l'affaire.

+0

Ah je vois - cela fonctionne grâce :) –

0

Le problème est qu'il ne peut pas y avoir une ligne items à référencer, car il est à travers la jointure externe; vous pourriez essayer refonte de votre clause WHERE en utilisant ISNULL:

WHERE ISNULL(items.deleted, 0) = 0