使用 where 子句时,如果数据为空,则将数据计数为零

Posted

技术标签:

【中文标题】使用 where 子句时,如果数据为空,则将数据计数为零【英文标题】:Count data as zero if it is null when where clause is used 【发布时间】:2014-01-28 12:04:07 【问题描述】:

现在我有这个查询:

SELECT 
opp.name as name,
count(log.stage_id) as stage_count
FROM 
crm_lead as opp LEFT OUTER JOIN crm_lead_stage_log as log ON (opp.id = log.opportunity_id)
GROUP BY
name

它会输出这个结果:

name  | stage_count |
name1 | 2
name2 | 1
name3 | 0 

它会输出我需要的东西。但是,如果我给它设置任何条件,那么它会跳过计数为零的行,我需要能够看到这些行。 例如,如果我写这个查询:

SELECT 
opp.name as name,
count(log.stage_id) as stage_count
FROM 
crm_lead as opp LEFT OUTER JOIN crm_lead_stage_log as log ON (opp.id = log.opportunity_id)
WHERE WHEN log.create_date > '2014-01-28 08:49:03'
GROUP BY
name

然后它输出这个:

name  | stage_count |
name1 | 1

它会正确计算该时间间隔内的现有阶段数,但它会跳过时间间隔中不存在阶段数的行。我怎样才能让它像这样输出(在那个例子中,只有第一行的一个阶段在新查询的那个时间间隔内被计算在内,对于其他行,它计数为零,因为它不存在):

name  | stage_count |
name1 | 1
name2 | 0
name3 | 0 

这样可以吗? 附:如果需要更多信息,比如将此查询示例放到网上查看,只需写评论,我会更新我的答案。

【问题讨论】:

【参考方案1】:

外部联接表上的 where 条件将外部联接转换为内部联接(因为“不存在的行将具有 NULL 值,并且 NULL 与其他值的比较产生“未定义”,因此将从结果中删除该行)

您需要将该条件移动到连接条件中:

SELECT opp.name as name,
       count(log.stage_id) as stage_count
FROM crm_lead as opp 
  LEFT JOIN crm_lead_stage_log as log 
         ON opp.id = log.opportunity_id
        AND log.create_date > '2014-01-28 08:49:03'
GROUP BY name;

【讨论】:

【参考方案2】:

如果要在结果为空时返回零​​,可以使用命令COALESCE。

SELECT 
opp.name AS name,
COALESCE(COUNT(log.stage_id)),0) AS stage_count
FROM 
crm_lead AS opp LEFT OUTER JOIN crm_lead_stage_log AS log ON (opp.id = log.opportunity_id)
GROUP BY name

当count为空时返回“0”。

【讨论】:

以上是关于使用 where 子句时,如果数据为空,则将数据计数为零的主要内容,如果未能解决你的问题,请参考以下文章

plsql 检查 where 子句中至少一个变量不为空

SQL中使用UPDATE更新数据时一定要记得WHERE子句

如果图像的值为空,则将图像从数据库加载到 Windows 窗体中

在mysql select语句中使用条件where子句

使用asp.net mv在ado.net中选择带有where子句的查询

如果满足 COUNT 条件,我可以应用 WHERE 子句吗?