您的位置:首页 > 数据库 > Oracle

Oracle占比函数: oracle ratio_to_report

2017-09-15 18:24 344 查看
 今天学习了一个函数ratio_to_report占比函数,这个函数有什么用呢,简单来说就是算百分比的。

以下做个实验:

SQL> create table emp as select * from scott.emp;

Table created.

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

14 rows selected.

SQL> select deptno,sum(sal) from emp group by rollup(deptno);

DEPTNO SUM(SAL)
---------- ----------
10 8750
20 10875
30 9400
29025
SQL> select empno,ename,job,hiredate,sal,deptno,
2 ratio_to_report(sal)over() as bfb1,
3 ratio_to_report(sal)over(partition by deptno) as bfb2 from emp;

EMPNO ENAME JOB HIREDATE SAL DEPTNO BFB1 BFB2
---------- ---------- --------- --------- ---------- ---------- ---------- ----------
7782 CLARK MANAGER 09-JUN-81 2450 10 .084409991 .28
7839 KING PRESIDENT 17-NOV-81 5000 10 .172265289 .571428571
7934 MILLER CLERK 23-JAN-82 1300 10 .044788975 .148571429
7566 JONES MANAGER 02-APR-81 2975 20 .102497847 .273563218
7902 FORD ANALYST 03-DEC-81 3000 20 .103359173 .275862069
7876 ADAMS CLERK 23-MAY-87 1100 20 .037898363 .101149425
7369 SMITH CLERK 17-DEC-80 800 20 .027562446 .073563218
7788 SCOTT ANALYST 19-APR-87 3000 20 .103359173 .275862069
7521 WARD SALESMAN 22-FEB-81 1250 30 .043066322 .132978723
7844 TURNER SALESMAN 08-SEP-81 1500 30 .051679587 .159574468
7499 ALLEN SALESMAN 20-FEB-81 1600 30 .055124892 .170212766

EMPNO ENAME JOB HIREDATE SAL DEPTNO BFB1 BFB2
---------- ---------- --------- --------- ---------- ---------- ---------- ----------
7900 JAMES CLERK 03-DEC-81 950 30 .032730405 .10106383
7698 BLAKE MANAGER 01-MAY-81 2850 30 .098191214 .303191489
7654 MARTIN SALESMAN 28-SEP-81 1250 30 .043066322 .132978723

14 rows selected.
SQL> select empno,ename,job,hiredate,sql,deptno,
2 ratio_to_report(sal) over(partition by deptno order by asl) as bfb from emp;
ratio_to_report(sal) over(partition by deptno order by asl) as bfb from emp
*
ERROR at line 2:
ORA-30487: ORDER BY not allowed here


总结:

      结果里面的 

             bfb1是每个SAL占所有记录的SAL的百分比。比如EMPNO=7782的这行, 2450/29025=.084409991

             bfb2是每个SAL占自己所在部门的百分比   ,比如EMPNO=7782的这行, 2450/8750=0.28

    从最后的报错信息可以看出:ratio_to_report是不支持order by的。

     版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: