Problem
We are often asked to calculate summary information concerning percentage of counts, such as the percentage of our customers living in each state, percentage of credit card transactions by Merchant Category Code, percentage of employees by job tile, etc. For example, how do we calculate the percentage of number of employees by job title for the following table?
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
Approach 1.
The simplest solution is to use Oracle analytic function ratio_to_report function with count(*) as the input parameter.SQL> select JOB, ratio_to_report(count(*)) over() as percentage from emp group by job order by JOB; JOB PERCENTAGE --------- ---------- ANALYST .142857143 CLERK .285714286 MANAGER .214285714 PRESIDENT .071428571 SALESMAN .285714286
Approach 2.
If we do not use anlytic function ratio_to_report, we need to do it in two steps.
SQL> select JOB, count(*)/(select count(*) as total from emp) as percentage from emp group by job order by JOB; JOB PERCENTAGE --------- ---------- ANALYST .142857143 CLERK .285714286 MANAGER .214285714 PRESIDENT .071428571 SALESMAN .285714286
Approach 3.
We can take advantage of "new_value" feature to define a variable total_num, fill it with the actual total counts of employees and use it ( as &total_num) in calculating the percentage.
SQL> column total new_value total_num
SQL> select count(*) as total from emp;
TOTAL
----------
14
SQL> select JOB, count(*)/&total_num as percentage from emp group by job order by JOB;
old 1: select JOB, count(*)/&total_num as percentage from emp group by job order by JOB
new 1: select JOB, count(*)/ 14 as percentage from emp group by job order by JOB
JOB PERCENTAGE
--------- ----------
ANALYST .142857143
CLERK .285714286
MANAGER .214285714
PRESIDENT .071428571
SALESMAN .285714286
1 comment:
Very Interesting work !!
Post a Comment