web-dev-qa-db-ja.com

同じクエリで異なる条件のPostgresカウント

[〜#〜] edit [〜#〜]Postgres 9.3

次のスキーマを持つレポートを作成しています: http://sqlfiddle.com/#!15/fd104/2

現在のクエリは次のように正常に機能しています。

enter image description here

基本的には3テーブルの内部結合です。私はこのクエリを作成しませんでしたが、それを残した開発者がクエリを変更したいと考えています。ご覧のとおり、TotalApplicationa.agent_idに基づいてアプリケーションの総数を数えるだけです。そして、結果にtotalapplication列が表示されます。それを削除して、totalapplicationを新しい2つの列に変更します。 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

AND disposition = 'Completed Survey'を追加しましたが、partialsurveyの同じクエリを含むcompletedsurveyの別の列が必要です。

AND disposition = 'Partial Survey'

そして

COUNT(a.id) as PartialSurvey

しかし、私はそのクエリをどこに配置するか、またはクエリがどのようになるかを知りません。

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

それが問題なければ、applicationperhourとrphを自分で修正できます

45
jackhammer013

私があなたを正しく理解していれば、フィルターされた(条件付き)集計を探しています。

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;

編集
古いバージョン(<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;
90