Problem
Similar to the problem mentioned in In the earlier post, Three Ways of Calculating Percentage of Counts Using Oracle SQL, we often need to calculate percentage based on the quantity such as revenue by product type, total expense by department, etc. In the following example, how do we calculate the percentage of salary expense by job title?
SQL> select EMPNO, ENAME, JOB, SAL from emp;
EMPNO ENAME JOB SAL
---------- ---------- --------- ----------
7839 KING PRESIDENT 5000
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7566 JONES MANAGER 2975
7788 SCOTT ANALYST 3000
7902 FORD ANALYST 3000
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7654 MARTIN SALESMAN 1250
7844 TURNER SALESMAN 1500
7876 ADAMS CLERK 1100
7900 JAMES CLERK 950
7934 MILLER CLERK 1300
14 rows selected.
Solution
In the same way as described in Three Ways of Calculating Percentage of Counts Using Oracle SQL, three approaches are described here to calculate percentage by quantity.
Approach 1.
We use Oracle analytic ratio_to_report function and pass the function sum(sal) to it. This is the simplest solution.SQL> select JOB, ratio_to_report(sum(SAL)) over() as percentage from emp group by job order by JOB; JOB PERCENTAGE --------- ---------- ANALYST .206718346 CLERK .142980189 MANAGER .285099053 PRESIDENT .172265289 SALESMAN .192937123
Approach 2.
We calculate total salary first in a sub query.SQL> select JOB, sum(SAL)/(select sum(SAL) as total from emp) as percentage from emp group by job order by JOB; JOB PERCENTAGE --------- ---------- ANALYST .206718346 CLERK .142980189 MANAGER .285099053 PRESIDENT .172265289 SALESMAN .192937123
Approach 3.
Again, we make use of new_value to generate SQLPLUS variable &total_sal.
SQL> column total_sal new_value total_sal
SQL> select sum(SAL) as total_sal from emp;
TOTAL_SAL
----------
29025
SQL> select JOB, sum(SAL)/&total_sal as percentage from emp group by job order by JOB;
old 1: select JOB, sum(SAL)/&total_sal as percentage from emp group by job order by JOB
new 1: select JOB, sum(SAL)/ 29025 as percentage from emp group by job order by JOB
JOB PERCENTAGE
--------- ----------
ANALYST .206718346
CLERK .142980189
MANAGER .285099053
PRESIDENT .172265289
SALESMAN .192937123
No comments:
Post a Comment