Postgres Count 在同一查询中具有不同的条件

Postgres Count with different condition on the same query

我正在处理具有以下架构的报告:http://sqlfiddle.com/#!15/fd104/2

当前查询工作正常,如下所示:

基本上是一个3table内连接。我没有提出这个查询,但是留下它的开发人员,我想修改查询。可以看到,TotalApplication只是根据a.agent_id统计了申请总数。您可以在结果中看到 totalapplication 列。我想要的是删除它并将 totalapplication 更改为新的两列。我想添加 completedsurveypartitalsurvey 列。所以基本上这部分会变成

SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE  a.created_at >= '2015-08-01' AND 
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id

我刚刚添加了 AND disposition = 'Completed Survey' 但我需要另一列用于 partialsurvey,它具有与 completedsurvey 相同的查询,唯一的区别是

AND disposition = 'Partial Survey'

COUNT(a.id) as PartialSurvey

但我不知道该查询放在哪里或者查询看起来如何like.So最终输出有这些列

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph

一旦没问题,applicationperhour 和 rph 我可以自己修复它

如果我没理解错的话,您正在寻找经过过滤的(条件)聚合:

SELECT a.agent_id as agent_id, 
       COUNT(a.id) filter (where disposition = 'Completed Survey') as CompletedSurvey, 
       count(a.id) filter (where disposition = 'Partial Survey') as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;

以上假定当前版本的 Postgres(在撰写本文时为 9.4)。对于旧版本 (< 9.4),您需要使用 case 语句,因为那里不支持 filter 条件:

SELECT a.agent_id as agent_id, 
       COUNT(case when disposition = 'Completed Survey' then a.id end) as CompletedSurvey, 
       COUNT(case when disposition = 'Partial Survey' then a.id end) as partial_survey
FROM forms a 
WHERE a.created_at >= '2015-08-01' 
  AND a.created_at <= '2015-08-31' 
GROUP BY a.agent_id;