遇到SQL COUNT问题

时间:2009-09-24 10:17:56

标签: sql sql-server-2005 count group-by

我正在使用MS SQL 2008,我有一个状态表(id,name)和一个项目表(id,name,statusid,deleted)。

我想计算每种状态的项目数,并具有以下查询:

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子句会查询我的查询?我怀疑我的方法可能有误......

谢谢:)

2 个答案:

答案 0 :(得分: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无效:COUNT永远不会返回NULL个值。它只是不计算NULL s,所以将JOIN子句的一部分列放入COUNT就可以了。

答案 1 :(得分:0)

问题是可能没有要引用的items行,因为它跨越外连接;您可以尝试使用ISNULL重新编写WHERE子句:

WHERE ISNULL(items.deleted, 0) = 0