सबसे पहले, आपके यहां जो समस्या हो रही है वह यह है कि आप जो कह रहे हैं वह यह है कि "यदि ग्रेड 70 से कम है, तो इस केस एक्सप्रेशन का मान गिनती (रैंक) है। अन्यथा, इस अभिव्यक्ति का मान गिनती (रैंक) है। ।" तो, किसी भी मामले में, आपको हमेशा एक ही मान मिलता है।
SELECT
CASE
WHEN grade < 70 THEN COUNT(rank)
ELSE COUNT(rank)
END
FROM
grades
गिनती() केवल गैर-शून्य मानों की गणना करता है, इसलिए आम तौर पर आप जो पैटर्न देख रहे हैं उसे पूरा करने के लिए आप जो पैटर्न देखेंगे वह यह है:
SELECT
count(CASE WHEN grade < 70 THEN 1 END) as grade_less_than_70,
count(CASE WHEN grade >= 70 and grade < 80 THEN 1 END) as grade_between_70_and_80
FROM
grades
इस तरह केस एक्सप्रेशन केवल 1 का मूल्यांकन करेगा जब परीक्षण अभिव्यक्ति सत्य होगी और अन्यथा शून्य होगी। फिर गिनती() केवल गैर-शून्य उदाहरणों की गणना करेगी, यानी जब परीक्षण अभिव्यक्ति सत्य है, जो आपको वह चाहिए जो आपको चाहिए।
संपादित करें:एक साइड नोट के रूप में, ध्यान दें कि यह बिल्कुल वैसा ही है जैसा आपने मूल रूप से count(if(test, true-value, false-value))
का उपयोग करके लिखा था। , केवल count(case when test then true-value end)
(और शून्य एक else
. के बाद से झूठे मूल्य में स्टैंड है मामले में आपूर्ति नहीं की गई थी)।
संपादित करें:इस मूल एक्सचेंज के कुछ महीनों बाद पोस्टग्रेज 9.4 जारी किया गया था। उस संस्करण ने कुल फ़िल्टर पेश किए, जो इस तरह के परिदृश्यों को थोड़ा अच्छा और स्पष्ट बना सकते हैं। यह उत्तर अभी भी कुछ सामयिक उत्थान प्राप्त करता है, इसलिए यदि आप यहां पर ठोकर खा चुके हैं और एक नए पोस्टग्रेज (यानी 9.4+) का उपयोग कर रहे हैं तो आप इस समकक्ष संस्करण पर विचार करना चाहेंगे:
SELECT
count(*) filter (where grade < 70) as grade_less_than_70,
count(*) filter (where grade >= 70 and grade < 80) as grade_between_70_and_80
FROM
grades