Postgres นับด้วยเงื่อนไขที่แตกต่างกันในแบบสอบถามเดียวกัน


37

แก้ไข Postgres 9.3

ฉันกำลังทำงานกับรายงานที่มีสคีมาต่อไปนี้: http://sqlfiddle.com/#!15/fd104/2

แบบสอบถามปัจจุบันทำงานได้ดีซึ่งมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยทั่วไปจะเข้าร่วม 3 ตารางภายใน ฉันไม่ได้ทำแบบสอบถามนี้ แต่นักพัฒนาที่ทิ้งไว้และฉันต้องการแก้ไขแบบสอบถาม ในขณะที่คุณสามารถมองเห็นเพียงแค่นับแอพลิเคชันทั้งหมดขึ้นอยู่กับTotalApplication a.agent_idและคุณสามารถดูtotalapplicationคอลัมน์ในผลลัพธ์ได้ สิ่งที่ฉันต้องการคือการลบและเปลี่ยนtotalapplicationเป็นสองคอลัมน์ใหม่ ฉันต้องการเพิ่ม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

เมื่อมันโอเคแล้วใช้งานต่อชั่วโมงและ rph ฉันสามารถแก้ไขได้ด้วยตัวเอง

คำตอบ:


74

ถ้าฉันเข้าใจคุณถูกต้องคุณกำลังมองหาการรวม (เงื่อนไข) ที่ถูกกรอง:

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

ลิงก์ไปที่ docs เมื่อFILTER: postgresql.org/docs/current/static/…
bcattle

มีประโยชน์สำหรับฉัน (/)
Sajeev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.