Oracle占比函数: oracle ratio_to_report

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37941193/article/details/77994513

 今天学习了一个函数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的。

     版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!      



猜你喜欢

转载自blog.csdn.net/m0_37941193/article/details/77994513