PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक ही चयन एसक्यूएल क्वेरी में एसयूएम () से पर्सेंट की गणना करें

इस प्रश्न में जितना प्रतीत हो सकता है, उससे कहीं अधिक है।

साधारण संस्करण

यह काफी है तेज़ और आसान:

SELECT property_name
      ,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
FROM   my_obj
GROUP  BY 1;

परिणाम:

property_name | pct
--------------+----
 prop_1       | 17
 prop_2       | 43

कैसे?

  • इसके लिए आपको किसी फंक्शन की बिल्कुल भी जरूरत नहीं है।

  • value_b counting की गणना करने के बजाय (जिसे आपको शुरू करने की आवश्यकता नहीं है) और कुल की गणना करते हुए, count(*) . का उपयोग करें कुल के लिए। तेज़, आसान।

  • यह मानता है कि आपके पास NULL नहीं है मूल्य। अर्थात। दोनों कॉलम परिभाषित हैं NOT NULL . आपके प्रश्न में जानकारी गायब है।
    यदि नहीं, तो आपकी मूल क्वेरी शायद वह नहीं कर रही है जो आपको लगता है कि यह करता है . यदि कोई मान NULL है, तो आपका संस्करण उस पंक्ति की बिल्कुल भी गणना नहीं करता है। आप विभाजन-दर-शून्य . को भी भड़का सकते हैं इस तरह से अपवाद।
    यह संस्करण NULL के साथ भी काम करता है। count(*) मानों की परवाह किए बिना सभी पंक्तियों की गिनती उत्पन्न करता है।

  • यहां बताया गया है कि गिनती कैसे काम करती है:

     TRUE  OR NULL = TRUE
     FALSE OR NULL = NULL
    

    count() NULL मानों को अनदेखा करता है। वोइला।

  • संचालिका वरीयता यह नियंत्रित करती है कि = OR . से पहले बाइंड करता है . आप इसे स्पष्ट करने के लिए कोष्ठक जोड़ सकते हैं:

    count ((value_a = value_b) OR FALSE)
    
  • आप

    . के साथ भी ऐसा ही कर सकते हैं
    count NULLIF(<expression>, FALSE)
    
  • परिणाम का प्रकार count() bigintहै डिफ़ॉल्ट रूप से।
    एक डिवीजन bigint / bigint , आंशिक अंकों को छोटा करता है

आंशिक अंक शामिल करें

100.0 का प्रयोग करें (आंशिक अंकों के साथ) गणना को numeric होने के लिए बाध्य करने के लिए और इस प्रकार भिन्नात्मक अंकों को संरक्षित करते हैं।
आप round() . का उपयोग करना चाह सकते हैं इसके साथ:

SELECT property_name
      ,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
FROM   my_obj
GROUP  BY 1;

परिणाम:

property_name | pct
--------------+-------
 prop_1       | 17.23
 prop_2       | 43.09

एक तरफ के रूप में:
मैं value_a का उपयोग करता हूं valueA . के बजाय . PostgreSQL में गैर-उद्धृत मिश्रित-केस आइडेंटिफ़ायर का उपयोग न करें। मैंने इस मूर्खता से बहुत अधिक हताश करने वाले प्रश्न आते हुए देखे हैं। यदि आप सोच रहे हैं कि मैं किस बारे में बात कर रहा हूं, तो मैनुअल में अध्याय पहचानकर्ता और कीवर्ड पढ़ें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:PostgreSQL में एक साथ सभी टेबलों पर OWNER को संशोधित करें

  2. डोकर-लिखें द्वारा पोस्टग्रेज करने के लिए Django कनेक्शन

  3. PostgreSQL सर्वर से कनेक्ट करने में असमर्थ:सर्वर से कनेक्ट नहीं हो सका:अनुमति अस्वीकृत

  4. पोस्टग्रेएसक्यूएल:नॉट इन बनाम एक्सेप्ट परफॉर्मेंस अंतर (संपादित # 2)

  5. PostgreSQL:FATAL - उपयोगकर्ता के लिए पीयर प्रमाणीकरण विफल (PG::ConnectionBad)