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

jac*_*013 72 postgresql join count postgresql-9.3 aggregate-filter

编辑Postgres 9.3

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

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

在此处输入图片说明

基本上它是一个 3 表内连接。我没有做这个查询,而是离开它的开发人员,我想修改查询。如您所见,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
Run Code Online (Sandbox Code Playgroud)

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

AND disposition = 'Partial Survey'
Run Code Online (Sandbox Code Playgroud)

COUNT(a.id) as PartialSurvey
Run Code Online (Sandbox Code Playgroud)

但我不知道该把查询放在哪里,也不知道查询会是什么样子。所以最终输出有这些列

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph
Run Code Online (Sandbox Code Playgroud)

一旦确定,然后 applicationperhour 和 rph 我可以自己修复它

a_h*_*ame 136

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

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;
Run Code Online (Sandbox Code Playgroud)

编辑
旧版本 (< 9.4) 您需要使用case语句:

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;
Run Code Online (Sandbox Code Playgroud)