使用 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 子句时,如果数据为空,则将数据计数为零的主要内容,如果未能解决你的问题,请参考以下文章
如果图像的值为空,则将图像从数据库加载到 Windows 窗体中