Postgres Aynı sorguda farklı koşullara sahip sayma


37

EDIT Postgres 9.3

Aşağıdaki şemaya sahip bir rapor üzerinde çalışıyorum: http://sqlfiddle.com/#!15/fd104/2

Şu anki sorgu şöyle gözüküyor:

görüntü tanımını buraya girin

Temelde bu 3 masa iç birleşimdir. Bu sorguyu yapmadım, ancak onu bırakan geliştirici ve sorguyu değiştirmek istiyorum. Gördüğünüz gibi, TotalApplicationsadece toplam uygulamayı sayar a.agent_id. Ve totalapplicationsonuçtaki sütunu görebilirsiniz . İstediğim şey onu kaldırmak ve totalapplicationyeni iki sütuna geçmek. Ben a eklemek istiyorum completedsurveyve partitalsurveysütun. Yani temelde bu kısım olacak

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

Daha yeni ekledim AND disposition = 'Completed Survey'ama partialsurveyaynı sorgunun completedsurveyolduğu tek bir sütuna ihtiyacım var.

AND disposition = 'Partial Survey'

ve

COUNT(a.id) as PartialSurvey

Ama bu sorguyu nereye koyacağımı bilemiyorum ya da sorgu nasıl görünecek. Son çıktıda bu sütunlar var.

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

Bir kez tamam o zaman applicationperhour ve rph Kendim düzeltebilirim

Yanıtlar:


74

Sizi doğru anlarsam, filtrelenmiş (koşullu) bir toplama arıyorsunuz:

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;

Düzen
eski sürümleri (<9.4) Bir kullanmak gerekmez için caseaçıklama:

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 kullanıyorum. Tamam mı?
jackhammer013

@JoeneFloresca: hayır, 9.3 için bir CASEbildiriye ihtiyacınız var . Her zaman, özellikle güncel değilse , kullandığınız sürümü belirtmeniz gerekir .
a_horse_with_no_name

Çok teşekkürler! şimdi mükemmel çalışıyor. Maalesef yayınımı düzenledik ve bir dahaki sefere aklımızda tutacak. Thanks :)
jackhammer013

Dokümanlara bağlantı FILTER: postgresql.org/docs/current/static/…
bcattle

Benim için yararlı (/)
Sajeev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.