Reputation: 2295
I'm working on a report which has this following schema: http://sqlfiddle.com/#!15/fd104/2
The current query is working fine which looks like this:
Basically it is a 3 table inner join. I did not make this query but the developer who left it and I want to modify the query. As you can see, TotalApplication
just counts the total application based on the a.agent_id
. And you can see the totalapplication
column in the result. What I want is to remove that and change the totalapplication
to a new two column. I want to add a completedsurvey
and partitalsurvey
column. So basically this part will become
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
I just added AND disposition = 'Completed Survey'
But I need another column for partialsurvey
which has the same query with completedsurvey
being the only difference is
AND disposition = 'Partial Survey'
and
COUNT(a.id) as PartialSurvey
But I dunno where to put that query or how will be the query look like.So the final output has these columns
agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph
Once it is ok then applicationperhour and rph I can fix it myself
Upvotes: 0
Views: 818
Reputation:
If I understand you correctly, you are looking for a filtered (conditional) aggregate:
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;
The above assumes the current version of Postgres (which is 9.4 at the time of writing). For older versions (< 9.4) you need to use a case
statement as the filter
condition is not supported there:
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;
Upvotes: 2