微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL – 如果为null,则将数据计为零(使用where子句时)

现在我有这个查询

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

它正确计算该时间间隔内的现有阶段编号,但它会跳过时间inerval中不存在阶段编号的行.我怎样才能使它像这样输出(在该示例中,第一行的一个阶段在新的查询的时间间隔内计算,对于其他行,它计为零,因为它不存在):

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

有可能这样做吗?
附:如果需要更多信息,比如将这个查询样本放在网上查看,只需写一条评论,我会更新我的答案).

解决方法

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

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

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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐