মোট যোগফলের চেয়ে এক সারির শতাংশের গণনা করা


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)একটি প্যাকেজ ভেরিয়েবল / প্রকারে আনবে এবং দ্বিতীয় অংশটি এই প্রাক-গণনা করা মানকে বোঝাবে, তবে আমি কীভাবে এটি সম্পাদন করতে পারব তা নিশ্চিত নই।

আমি এসকিউএল ব্যবহারের মধ্যে সীমাবদ্ধ এবং আমি ওরাকল 10 জি আর 2 তে চালাচ্ছি।


স্পষ্টতই কোনও ডিবিএ প্রশ্ন নয় (সম্ভবত এটি বিক্রয়কর্মীদের চেয়ে টেবিল স্পেসগুলি ছিল?) - সম্ভবত স্ট্যাক ওভারফ্লোতে থাকা উচিত।
গাইস

উত্তর:



9

সমস্ত কমিশনকে কমিশন এবং কমিশন শতাংশের সাহায্যে ফিরিয়ে আনার জন্য কোনও বিশ্লেষণমূলক ধারা ছাড়াই একটি বিশ্লেষণমূলক ফাংশন ব্যবহার করুন যাতে পার্টিশনটি পুরো টেবিলের উপরে চলে যায়:

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

আমি যেমন রেনে নেইফেনিগার (+1) এর কাছ থেকে শিখেছি অনুপাত_ থেকে_রেপোর্ট ফাংশনটি এই সিনট্যাক্সটিকে আরও শক্ত করে।

কমিশন এসইউএম সংরক্ষণ করার জন্য একটি প্যাকেজ ব্যবহারের ক্ষেত্রে পিএল / এসকিউএল জড়িত, যা আপনি বিশেষ করে এসকিউএল সমাধান চান তা উল্লেখ করে বাদ দেওয়া হয়েছিল, তবে আপনি ইতিমধ্যে ফাংশন ব্যবহার করছেন বলে আমি ধরে নিই আপনার উদ্দেশ্য পিএল / এসকিউএলকে বাদ দেওয়া হয়নি। যদি এটি হয় তবে প্যাকেজ সমাধানটি সহায়তা করতে পারে তবে এটি আপনার অ্যাপ্লিকেশন কীভাবে কাজ করে তা নির্ভর করে।

আপনার সেশনটি প্রথম তৈরি হয়ে গেলে এবং প্যাকেজটিতে ফাংশনটি কমিশন পাওয়ার জন্য কল করার সময় প্যাকেজ কনস্ট্রাক্টরের একটি অন্তর্নিহিত কল আসে যা সমষ্টি পেতে এবং এটি সঞ্চয় করতে পারে। তারপরে আপনি আপনার পেতে কমিশন ফাংশনে সঞ্চিত সমষ্টিটি উল্লেখ করতে পারেন এবং এটি একবারে যোগফলটি করতে হবে। অবশ্যই আপনি আলাদা সেশন থেকে ফাংশনটি কল করার সাথে সাথে যোগফলটি আবার গণনা করা হবে। এছাড়াও, প্রতিটি এজেন্টের জন্য ফাংশনটি কল করা সমস্ত এজেন্টদের জন্য একটি এসকিউএল স্টেটমেন্ট কল করার চেয়ে কম দক্ষ হবে যদি আপনার অ্যাপ্লিকেশনটি সেইভাবে ডিজাইন করা যায়।

আপনি আপনার ফাংশনটিকে এমন একটি পদ্ধতিতে রূপান্তর করতে চাইতে পারেন যা উপরের ক্যোয়ারির জন্য একটি কার্সার দেয় বা সম্ভবত এমন কোনও ফাংশন রয়েছে যা কোয়েরির ফলাফলগুলিকে পাইপলাইনযুক্ত ফলাফল সেট হিসাবে ফেরত দেয়।

নমুনা তথ্য:

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
@ লাই ~ ম্যানুয়াল পথে দুটি পাসের প্রয়োজন হওয়ায় এটি কীভাবে এটি একটি পাসে এটি করতে পারে? আমি দেখতে পাচ্ছি না যে কম্পিউটারগুলি কীভাবে% কে একটি যাদুকরী ওয়ান পাসের অপারেশন করতে পারে ...
jcolebrand

@ jcolebrand ডেটাবেসগুলি কেবল একবার ডাটাবেস ব্লক থেকে পড়ে। এটি সম্ভবত মেমরির ফলাফলগুলিতে এর একাধিক পাস করছে, তবে এটি সাধারণত দুটিবার ডাটাবেস ব্লক পড়ার চেয়ে দ্রুত। এই বিকল্পগুলির মধ্যে মেমরি এবং সিপিইউতে ট্রেডঅফ রয়েছে, তাই পছন্দটি সবসময় ক্লিয়ার কাট নাও হতে পারে, তবে এই ক্ষেত্রে আমি এটি মনে করি।
লেইফ রিফেল

1
@ লেইহ ea হ্যাঁ, আরও বিবেচনা আমাকে বিশ্বাস করতে পরিচালিত করবে যা কিছু করা সম্ভব , কেবল ব্ল্যাক বাক্সে বিভক্ত অপ্টিমাইজেশন। যাইহোক, আপনার উত্তরের একটি নিফটি সমাধান। ধন্যবাদ: ডি
জকোলেব্রান্ড

0
  select 
  Agent, Commission,
  (
      ROUND(
       (Commission *100) / 
          (
            (SELECT SUM(Commission)
             FROM commissions AS A)
          )
       ) 
  ) AS Porcentaje
  from  
  commissions
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.