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


38

Postgres 9.3の編集

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

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

ここに画像の説明を入力してください

基本的には、3テーブルの内部結合です。私はこのクエリを作成しませんでしたが、それを残した開発者がクエリを変更したいと思います。ご覧のとおり、にTotalApplication基づいてアプリケーション全体をカウントしますa.agent_id。そしてtotalapplication、結果の列を見ることができます。私が望むのは、それを削除しtotalapplicationて、新しい2列に変更することです。私はA追加したい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'別の列が必要ですpartialsurveycompletedsurvey

AND disposition = 'Partial Survey'

そして

COUNT(a.id) as PartialSurvey

しかし、私はそのクエリをどこに置くか、クエリがどのように見えるかを知らないので、最終的な出力にはこれらの列があります

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

OKになったらapplicationperhourとrphを自分で修正できます

回答:


75

私があなたを正しく理解していれば、フィルタリングされた(条件付き)集約を探しています:

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;

9.3を使用しています。大丈夫ですか?
jackhammer013

@JoeneFloresca:いいえ、9.3にはCASEステートメントが必要です。特に現在のバージョンではない場合は、常に使用しているバージョンを指定する必要があります。
a_horse_with_no_name

ありがとうございます!今完璧に動作します。申し訳ありませんが、私の投稿を編集しました。次回もそのことを念頭においてください。ありがとう:)
jackhammer013

上のドキュメントへのリンクFILTERpostgresql.org/docs/current/static/…–
bcattle

私に役立つ(/)
Sajeev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.