Sunday 15 June 2014

postgresql - Compute percents from SUM() in the same SELECT sql query -


तालिका my_obj में दो पूर्णांक फ़ील्ड हैं:

  (मूल्य_एक पूर्णांक, value_b पूर्णांक);   

मैं कितनी बार value_a = value_b की गणना करने की कोशिश करता हूं, और मैं प्रति अनुपात में यह अनुपात व्यक्त करना चाहता हूं। यह मैंने कोशिश की है कोड है:

  चुनें राशि (मामले जब o.value_a = o.value_b तब 1 और 0 अंत) nb_ok के रूप में, राशि (मामले जब o.value_a! = O Value_b तब 1 और 0 अंत) nb_not_ok, compute_percent (nb_ok, nb_not_ok) my_obj से ओ समूह के रूप में o.property_name;   

compute_percent एक संग्रहित कार्यप्रणाली है जो केवल (a * 100) / (a ​​+ b)

करता है लेकिन PostgreSQL शिकायत करता है कि कॉलम nb_ok मौजूद नहीं है।
आप इसे कैसे ठीक से कर सकते हैं?

मैं 9.1gb का उपयोग कर रहा हूं, जो कि उबंटू 12.04 के साथ है।

इस प्रश्न के मुकाबले ऐसा कुछ भी हो सकता है।

सरल संस्करण

यह अधिक तेज और सरल है:

  का चयन करें property_name, (गिनती (value_a = value_b या NULL) * 100) / गिनती (*) के रूप में my_obj ग्रुप द्वारा pct 1;   

परिणाम:

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

कैसे?

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

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

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

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

     < Code> TRUE या NULL = TRUE FALSE OR NULL = NULL   

    गिनती () शून्य मानों को अनदेखा करता है वोइलो।

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

      गिनती ((value_a = value_b) या गलत)    
  • आप कर सकते हैं गिनती के परिणाम प्रकार

      गिनती NULLIF (& lt; अभिव्यक्ति & gt ;, FALSE)    
  • ) डिफ़ॉल्ट रूप से है bigint । एक डिवीजन bigint / bigint , आंशिक अंक को घटाता है

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

    <कोड> संख्यात्मक करने के लिए गणना करने के लिए मजबूर करने के लिए 100.0 (आंशिक अंक के साथ) का उपयोग करें और इस तरह से आंशिक अंकों को संरक्षित करें।
    आप इसके साथ उपयोग करना चाह सकते हैं:

      का चयन करें property_name, round ((count (value_a = value_b OR null) * 100.0) / count (*), 2) के रूप में pct FROM my_obj ग्रुप BY 1;   

    परिणाम:

      property_name | Pct -------------- + ------- prop_1 | 17.23 प्रोपेल | 43.09   

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

No comments:

Post a Comment