Wednesday 15 January 2014

sql - calculate percentage of aggregated column -


निम्न परिणाम सेट का उपयोग करना:

 | DATE | बिजनेस | कॉललेज | स्थिति | घंटे | STANDARDHOURS | COUNTER | ओवर 16 | ओवर 32 | ओवर48 | -------------------------------------------------- -------------------------------------------------- ------------- | 2013-01-01 | एक | बॉब जोन्स | विश्लेषक | 168 | 168 | 1 | 0 | 0 | 0 | | 2013-01-01 | एक | सिंडी जोंस | सहायक | 184 | 168 | 1 | 1 | 0 | 0 | | 2013-01-01 | बी | टिम हरीस | प्रोग्रामर | 200 | 168 | 1 | 1 | 1 | 0 | | 2013-01-01 | बी | टॉम व्हाइट | प्रबंधक | 216 | 168 | 1 | 1 | 1 | 1 | | 2013-02-01 | एक | बॉब जोन्स | विश्लेषक | 176 | 176 | 1 | 0 | 0 | 0 | | 2013-02-01 | एक | सिंडी जोंस | सहायक | 176 | 176 | 1 | 0 | 0 | 0 | | 2013-02-01 | बी | टिम हरीस | प्रोग्रामर | 200 | 176 | 1 | 1 | 0 | 0 | | 2013-02-01 | बी | टॉम व्हाइट | प्रबंधक | 216 | 176 | 1 | 1 | 1 | 0 |  

इस क्वेरी का उपयोग करना:

  का चयन करें c.date, c.business, मामला जब योग (c.over16) & gt; 0 तब (सम (c.over16) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver16, मामले में जब राशि (c.over32) & gt; 0 तब (सम (c.over32) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver32, मामले में जब राशि (c.over48) & gt; 0 तब (सम (c.over48) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver48 से (SELECT a.date, a.business, a.colague, a.position, a.hours, b.standardhours , 1 ए एस काउंटर, केस जब एक.hours & gt; = b.standardhours + 16 THEN 1 ELSE 0 END के रूप में 16 से अधिक, मामले में जब एक.hours & gt; = b.standardhours + 32 THEN 1 ELSE 0 से अधिक AS32, मामला जब एक .hours & gt; = b.standardhours + 48 THEN 1 ELSE 0 से अधिक के रूप में 48 से अधिक समय से जुड़ने के लिए एक व्यवसाय जोड़ें b.date = a.date पर) सी ग्रुप द्वारा c.date, c.business   

मुझे मिल रहा है:

 | DATE | बिजनेस | PERCOVER16 | PERCOVER32 | PERCOVER48 | -------------------------------------------------- -------------- | 2013-01-01 | एक | 0 | 0 | 0 | | 2013-01-01 | बी | 100 | 100 | 0 | | 2013-02-01 | एक | 0 | 0 | 0 | | 2013-02-01 | बी | 100 | 0 | 0 |  

वांछित परिणाम है:

 | DATE | बिजनेस | PERCOVER16 | PERCOVER32 | PERCOVER48 | -------------------------------------------------- -------------- | 2013-01-01 | एक | 50 | 0 | 0 | | 2013-01-01 | बी | 100 | 100 | 50 | | 2013-02-01 | एक | 0 | 0 | 0 | | 2013-02-01 | बी | 100 | 50 | 0 |  

मेरा मानना ​​है कि आपके द्वारा की जाने वाली समस्या पूर्णांक विभक्त समस्या है। आप विभाजन को करने से पहले मूल्यों को दशमलव या फ़्लोटिंग बिंदु प्रारूप में कनवर्ट करना चाहते हैं। यहां एक तरीका है:

  का चयन करें c.date, c.business, मामले जब योग (c.over16) & gt; 0 तब (सम (c.over16 * 1.0) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver16, मामले में जब राशि (c.over32) & gt; 0 तब (सम (c.over32 * 1.0) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver32, मामले में जब राशि (c.over48) & gt; 0 तब (सम (c.over48 * 1.0) / योग (c.counter)) * 100 ELSE 0 END के रूप में percOver48   

संपादित करें:

सबसे आसान विकल्प है Subquery में काउंटर की परिभाषा बदलने के लिए:

  1.0 काउंटर के रूप में, - यह एक दशमलव बिंदु है इसलिए इसका उपयोग विभाजन के लिए किया जा सकता है   

यह यह एक गैर-पूर्णांक, संख्यात्मक डेटा प्रकार के रूप में परिभाषित करेगा।

उत्पादन कोड के लिए एक सामान्य नियम के रूप में, मुझे ये रूपांतरण होने चाहिए जहां विभाजन हो रहा है, अप्रत्याशित त्रुटियों को रोकने के लिए कहीं सड़क के नीचे, आप या कोई अन्य व्यक्ति 1.0 को काउंटर के रूप में देख सकता है और सोचता है "यह बेवकूफ़ है। काउंटर पूर्णांक होना चाहिए।" आप या वह या तो उसे बदलता है, और सामान टूटता है या किसी को योग (c.counter) देखता है और सोचता है कि "यह बेवकूफी है। यह सिर्फ गिनती (*) या गिनती (c.counter)

दूसरी तरफ, विज्ञापन-हॉक कोड के लिए, मैं शायद सिर्फ काउंटर 1.0 को बनाऊँगा।

No comments:

Post a Comment