2009-09-24 49 views
1

我正在使用MS SQL 2008,我有一個狀態表(id,name)和一個表項(id,name,statusid,deleted)。SQL COUNT有問題

我想指望每個狀態的項目數,並有以下查詢:

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 

的複雜性在於,我想所有的狀態,用0,如果沒有物品狀態。

上述工作正常,但是當我添加WHERE items.deleted = 0時,它不再顯示其中有0的行。

爲什麼WHERE子句會導致我的查詢失效?我懷疑我的方法可能是錯誤的...

謝謝:)

回答

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 

爲什麼WHERE條款殺了我的查詢?我懷疑我的方法可能是錯誤的...

因爲如果有與給定statusid沒有項目,LEFT JOIN返回單行所有項目字段設置爲NULL

您的WHERE子句將這些行過濾掉(NULL = 0返回NULL)並且它們不會進入GROUP BY

另請注意,上的ISNULL無效:COUNT從不返回NULL值。它只是不計算NULL s,因此將JOIN子句的一部分放入COUNT這一列是無濟於事。

+0

啊我看到了 - 作品謝謝:) – 2009-09-24 10:24:17

0

問題是,可能沒有items行可供引用,因爲它跨越外部聯接;你可以嘗試使用ISNULL重鑄你的WHERE子句:

WHERE ISNULL(items.deleted, 0) = 0