एक ही क्वेरी पर अलग-अलग स्थिति वाले पोस्टग्रेट्स की गणना करें


38

EDIT पोस्टग्रेट्स 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

एक बार जब यह ठीक हो जाता है तो एप्लीकेशनपरहोर और आरएफ मैं इसे खुद ठीक कर सकता हूं

जवाबों:


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 का उपयोग कर रहा हूं। ठीक है न?
जैकहमरानी

@JoeneFloresca: नहीं, 9.3 के लिए आपको एक CASEबयान की आवश्यकता है । आपको हमेशा अपने द्वारा उपयोग किए जा रहे संस्करण को निर्दिष्ट करना चाहिए, खासकर अगर यह चालू नहीं है।
a_horse_with_no_name 8

बहुत बहुत धन्यवाद! अब सही काम करता है। क्षमा करें, मेरे पोस्ट को संपादित किया और अगली बार इसे ध्यान में रखेंगे। धन्यवाद :)
jackhammer013

डॉक्स से लिंक करें FILTER: postgresql.org/docs/current/static/…
bcattle

मेरे लिए उपयोगी (/)
सजीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.