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为新的两列。我想添加一个completedsurvey和partitalsurvey列。所以基本上这部分会变成
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)