【问题标题】:Having trouble with SQL COUNTSQL COUNT 遇到问题
【发布时间】:2010-12-01 01:06:25
【问题描述】:

我使用的是 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 子句会终止我的查询?我怀疑我的方法可能是错误的......

谢谢:)

【问题讨论】:

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


    【解决方案1】:

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

    WHERE ISNULL(items.deleted, 0) = 0
    

    【讨论】:

      【解决方案2】:
      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

      还要注意COUNT 上的ISNULL 是无用的:COUNT 永远不会返回 NULL 值。它只是不计入NULLs,因此将属于JOIN 子句的列放入COUNT 就可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 2016-06-04
        • 2021-10-28
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多