Postgres Hitung dengan kondisi berbeda pada kueri yang sama

38

EDIT Postgres 9.3

Saya sedang mengerjakan laporan yang memiliki skema berikut: http://sqlfiddle.com/#!15/fd104/2

Kueri saat ini berfungsi dengan baik yang terlihat seperti ini:

masukkan deskripsi gambar di sini

Pada dasarnya itu adalah 3 tabel bergabung dalam. Saya tidak membuat kueri ini tetapi pengembang yang meninggalkannya dan saya ingin memodifikasi kueri. Seperti yang Anda lihat, TotalApplicationcukup hitung total aplikasi berdasarkan a.agent_id. Dan Anda dapat melihat totalapplicationkolom di hasilnya. Yang saya inginkan adalah menghapusnya dan mengubah totalapplicationke dua kolom baru. Saya ingin menambahkan kolom completedsurveydan partitalsurvey. Jadi pada dasarnya bagian ini akan menjadi

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

Saya baru saja menambahkan AND disposition = 'Completed Survey'Tapi saya perlu kolom lain partialsurveyyang memiliki kueri yang sama dengan completedsurveymenjadi satu-satunya perbedaan

AND disposition = 'Partial Survey'

dan

COUNT(a.id) as PartialSurvey

Tapi saya tidak tahu di mana harus menempatkan query itu atau bagaimana akan terlihat seperti query. Jadi hasil akhir memiliki kolom ini

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

Setelah ok maka applicationperhour dan rph saya bisa memperbaikinya sendiri

jackhammer013
sumber

Jawaban:

75

Jika saya mengerti Anda dengan benar, Anda mencari agregat yang difilter (bersyarat):

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;

Edit
untuk versi yang lebih lama (<9.4) Anda perlu menggunakan casepernyataan:

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;
seekor kuda tanpa nama
sumber
Saya menggunakan 9.3. Apakah itu oke?
jackhammer013
@ JoeneFloresca: tidak, untuk 9.3 Anda perlu CASEpernyataan. Anda harus selalu menentukan versi yang Anda gunakan, terutama jika itu bukan yang sekarang.
a_horse_with_no_name
Terima kasih banyak! bekerja dengan sempurna sekarang. Maaf soal itu, edit posting saya dan akan mengingatnya lain kali. Terima kasih :)
jackhammer013
Tautan ke dokumen di FILTER: postgresql.org/docs/current/static/…
bcattle
Berguna untuk saya (/)
Sajeev