कुल योग पर एक पंक्ति के प्रतिशत की गणना


13

बुरे शीर्षक के लिए क्षमा याचना, मुझे यकीन नहीं था कि इसके लिए एक अच्छा शीर्षक क्या होगा।

यह वर्तमान में (मेरे द्वारा काम कर रहे) डेटा का सरलीकृत दृश्य है

Agent    |  Commission     
---------|------------
Smith    |    100
Neo      |    200
Morpheus |    300

मुझे कुल कमीशन के प्रतिशत की गणना करने की आवश्यकता है, प्रत्येक एजेंट के लिए जिम्मेदार है।

इसलिए, एजेंट स्मिथ के लिए, प्रतिशत की गणना की जाएगी (Agent Smith's commission / Sum(commission)*100

तो, मेरा अपेक्षित डेटा होगा

Agent    |  Commission   |  % Commission    
---------|---------------|---------------
Smith    |    100        |     17
Neo      |    200        |     33
Morpheus |    300        |     50

मेरे पास प्रत्येक एजेंट के लिए कमीशन लौटाने का एक फ़ंक्शन है। मेरे पास एक और फ़ंक्शन है जो प्रतिशत के रूप में लौटाता है (Commission/Sum(Commission))*100। समस्या यह है कि Sum(commission)प्रत्येक पंक्ति के लिए गणना की जाती है, और यह देखते हुए कि यह क्वेरी डेटा वेयरहाउस पर चलाई जाएगी, डेटा सेट बड़ा होगा (वर्तमान में, यह सिर्फ 2000 रिकॉर्ड के तहत है) और काफी ईमानदारी से, एक बुरा दृष्टिकोण (आईएमओ) )।

वहाँ Sum(Commission)हर पंक्ति के लिए गणना नहीं होने का एक तरीका है ?

मैं 2 भाग की क्वेरी की तर्ज पर कुछ सोच रहा था, पहला भाग sum(commission)एक पैकेज चर / प्रकार में लाएगा और दूसरा भाग इस पूर्व-परिकलित मान को संदर्भित करेगा, लेकिन मुझे यकीन नहीं है कि मैं इसे कैसे पूरा कर सकता हूं।

मैं SQL का उपयोग करने के लिए सीमित हूं, और मैं Oracle 10g R2 पर चल रहा हूं।


स्पष्ट रूप से एक डीबीए प्रश्न नहीं (शायद अगर यह सेल्समेन के बजाय टेबलस्पेस थे?) - शायद स्टैक ओवरफ्लो पर होना चाहिए।
गयास

जवाबों:



9

सभी एजेंटों को उनके कमीशन और कमीशन प्रतिशत के साथ वापस लौटने के लिए एक विश्लेषणात्मक फ़ंक्शन का उपयोग करें जिसमें कोई विश्लेषणात्मक खंड न हो ताकि विभाजन पूरी तालिका में हो:

SELECT Agent, commission, 100* commission / (SUM(commission) OVER ()) "% Commission" 
FROM commissions;

जैसा कि मैंने René Nyffenegger (+1) से सीखा है कि ratio_to_report फ़ंक्शन इस सिंटैक्स को कसता है।

आयोग SUM को संग्रहीत करने के लिए एक पैकेज का उपयोग करने में PL / SQL शामिल होगा, जिसे आपने विशेष रूप से यह इंगित करके बाहर रखा था कि आप एक SQL समाधान चाहते हैं, लेकिन चूंकि आप पहले से ही फ़ंक्शन का उपयोग कर रहे हैं, मुझे लगता है कि आपका इरादा PL / SQL को बाहर करना नहीं था। यदि यह मामला है, तो पैकेज समाधान में मदद मिल सकती है, लेकिन यह इस बात पर निर्भर करता है कि आपका आवेदन कैसे काम करता है।

जब आपका सत्र पहली बार बनाया जाता है और आयोग को प्राप्त करने के लिए पैकेज में फ़ंक्शन को कॉल करता है, तो पैकेज कंस्ट्रक्टर को एक अंतर्निहित कॉल मिलती है जो राशि प्राप्त कर सकती है और इसे संग्रहीत कर सकती है। तब आप अपने प्राप्त कमीशन फ़ंक्शन में संग्रहीत राशि को संदर्भित कर सकते हैं और यह केवल एक बार योग करना होगा। बेशक, जैसे ही आप एक अलग सत्र से फ़ंक्शन को कॉल करते हैं, राशि की गणना फिर से की जाएगी। साथ ही, प्रत्येक एजेंट के लिए फ़ंक्शन को कॉल करना सभी एजेंटों के लिए एक एसक्यूएल स्टेटमेंट को कॉल करने की तुलना में काफी कम कुशल होगा यदि आपका एप्लिकेशन उस तरीके से डिज़ाइन किया जा सकता है।

आप अपने फ़ंक्शन को एक ऐसी प्रक्रिया में बदलने पर विचार कर सकते हैं जो ऊपर दिए गए क्वेरी के लिए कर्सर लौटाती है या शायद एक फ़ंक्शन है जो क्वेरी के परिणामों को एक पाइपलाइन किए गए परिणाम के रूप में देता है।

नमूना डेटा:

create table commissions (Agent Varchar2(100), Commission Number(3));
insert into commissions values ('Smith',100);
insert into commissions values ('Neo',200);
insert into commissions values ('Morpheus',300);

5

आप निम्नलिखित प्रश्न का प्रयास कर सकते हैं, योग (कमीशन) की गणना केवल एक बार की जाएगी:

WITH TOTAL_COMMISSION AS 
(SELECT SUM(COMMISSION) AS TOTAL FROM AGENTS)
SELECT A.AGENT_NAME, A.COMMISSION, ((A.COMMISSION/T.TOTAL)*100) AS "% COMMISSION"
FROM AGENTS A, TOTAL_COMMISSION T;

यह काम करता है और सही डेटा देता है, लेकिन एक विश्लेषणात्मक फ़ंक्शन की तुलना में कम कुशल है जो दो के बजाय एक पूर्ण तालिका स्कैन करता है (कोई अनुक्रमित नहीं मानते हुए)।
लेह रिफ़ेल

1
@Leigh ~ यह एक पास में कैसे कर सकता है क्योंकि मैनुअल तरीके से दो पास की आवश्यकता होती है? मैं नहीं देख सकते हैं कि कंप्यूटर% ofTotal एक जादुई एक-पास आपरेशन कर सकता है ...
jcolebrand

@jcolebrand डेटा केवल एक बार डेटाबेस ब्लॉक से पढ़ा जाता है। यह संभवतः मेमोरी परिणामों में इसके कई पास कर रहा है, लेकिन यह आमतौर पर डेटाबेस ब्लॉक को दो बार पढ़ने की तुलना में तेजी से होता है। इन विकल्पों के बीच मेमोरी और सीपीयू में ट्रेडऑफ़ हैं, इसलिए पसंद हमेशा स्पष्ट नहीं हो सकती है, लेकिन इस मामले में मुझे लगता है कि यह है।
लेह रिफ़ेल

1
@ ली ~ ~ हाँ, आगे विचार मुझे विश्वास है कि यह सब कर सकता है, बस ब्लैक बॉक्स घबराना अनुकूलन हो सकता है। वैसे भी, आपके जवाब में एक निफ्टी समाधान। धन्यवाद: डी
jcolebrand

0
  select 
  Agent, Commission,
  (
      ROUND(
       (Commission *100) / 
          (
            (SELECT SUM(Commission)
             FROM commissions AS A)
          )
       ) 
  ) AS Porcentaje
  from  
  commissions
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.