it-swarm.asia

حساب النسبة المئوية للصف على إجمالي المبلغ

أعتذر عن العنوان السيئ ، لم أكن متأكدًا مما سيكون عنوانًا جيدًا لهذا.

هذه حاليًا (عرض مبسط للبيانات) التي أعمل معها

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) لكل صف يتم جلبه؟

كنت أفكر في شيء ما على غرار استعلام مكون من جزأين ، الجزء الأول سيجلب sum(commission) إلى متغير/نوع الحزمة وسيشير الجزء الثاني إلى هذه القيمة المحسوبة مسبقًا ، لكنني لست أكيد كيف يمكنني تحقيق ذلك.

أنا مقيد باستخدام SQL ، وأنا أعمل على Oracle 10g R2.

13
Sathyajith Bhat

كنت تبحث عن analytical functionratio_to_report

select 
  agent,
  round(ratio_to_report(commission) over ()*100) "% Comm."
from  
  commissions;
23
René Nyffenegger

لإرجاع جميع الوكلاء مع عمولاتهم ونسب العمولات الخاصة بهم ، استخدم وظيفة تحليلية بدون شرط تحليلي بحيث يكون القسم فوق الجدول بأكمله:

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

كما علمت من René Nyffenegger (+1) ، فإن دالة ratio_to_report تشد بناء الجملة هذا.

ينطوي استخدام حزمة لتخزين Commission SUM على PL/SQL ، والذي استبعدته تحديدًا بالإشارة إلى رغبتك في حل SQL ، ولكن نظرًا لأنك تستخدم بالفعل وظائف افترض أن نيتك لم تكن استبعاد PL/SQL. إذا كان هذا هو الحال ، فقد يساعدك حل الحزمة ، ولكنه يعتمد على كيفية عمل تطبيقك.

عند إنشاء جلستك لأول مرة واستدعاء الوظيفة الموجودة في الحزمة للحصول على العمولة ، هناك استدعاء ضمني لمنشئ الحزم يمكنه الحصول على المبلغ وتخزينه. بعد ذلك ، يمكنك الرجوع إلى المبلغ المخزن في وظيفة الحصول على العمولة الخاصة بك ، وسيتعين عليه إجراء المبلغ مرة واحدة فقط. بالطبع بمجرد استدعاء الوظيفة من جلسة مختلفة ، سيتم حساب المبلغ مرة أخرى. أيضًا ، سيكون استدعاء الوظيفة لكل وكيل أقل فعالية بكثير من استدعاء عبارة 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);
9
Leigh Riffel

يمكنك تجربة الاستعلام التالي ، سيتم احتساب المبلغ (العمولة) مرة واحدة فقط:

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;
5
Robert Durgin
  select 
  Agent, Commission,
  (
      ROUND(
       (Commission *100) / 
          (
            (SELECT SUM(Commission)
             FROM commissions AS A)
          )
       ) 
  ) AS Porcentaje
  from  
  commissions
0
JoeDeg