And*_*ius 6 sql postgresql join count where-clause
现在我有这个查询:
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
Run Code Online (Sandbox Code Playgroud)
并输出以下结果:
name | stage_count |
name1 | 2
name2 | 1
name3 | 0
Run Code Online (Sandbox Code Playgroud)
它输出我需要的东西.但是如果我给它添加任何条件,那么它会跳过零计数的行,我需要能够看到它.例如,如果我写这个查询:
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
Run Code Online (Sandbox Code Playgroud)
然后它输出:
name | stage_count |
name1 | 1
Run Code Online (Sandbox Code Playgroud)
它正确计算该时间间隔内的现有阶段编号,但它会跳过时间inerval中不存在阶段编号的行.我怎样才能使它像这样输出(在该示例中,第一行的一个阶段在新的查询的时间间隔内计算,对于其他行,它计为零,因为它不存在):
name | stage_count |
name1 | 1
name2 | 0
name3 | 0
Run Code Online (Sandbox Code Playgroud)
有可能这样做吗?PS如果需要更多信息,比如把这个查询样本放到网上查看,只需写一个评论,我会更新我的答案).
外部联接表上的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;
Run Code Online (Sandbox Code Playgroud)
小智 5
如果要在结果为空时返回零,则可以使用逗号和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
Run Code Online (Sandbox Code Playgroud)
当count获得空值时,它将返回“ 0”。
| 归档时间: |
|
| 查看次数: |
11309 次 |
| 最近记录: |