这个函数在oracle帮助文档的位置:SQL Reference里面,很好找的。

除报告详细数据外,许多报告中还包括每行总数的百分比。例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相对于总销售额的百分比。

传统上,Oracle计算百分比的方法是在总计报告的子查询中使用SUM函数总计报告,然后把那个结果放到细节表中相除来计算百分比。你还可以用一个子查询作为SELECT语句表达式:

RATIO_TO_REPORT解析函数使得这种类型的查询更容易编码。Oracle 8i中引入了这个函数,它的格式如下:

RATIO_TO_REPORT (expr) OVER (query_partition_clause)

这个上面的语法我就不多说了,直接看演示的例子吧。

  1. [root@suys1 ~]# su - oracle
  2. [oracle@suys1 ~]$ sqlplus / as sysdba
  3. SQL*Plus: Release 11.2.0.4.0 Production on Fri Jun 6 09:00:03 2014
  4. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  5. Connected to an idle instance.
  6. SQL> startup
  7. ORACLE instance started.
  8. Total System Global Area 1653518336 bytes
  9. Fixed Size                  2253784 bytes
  10. Variable Size            1040190504 bytes
  11. Database Buffers          603979776 bytes
  12. Redo Buffers                7094272 bytes
  13. Database mounted.
  14. Database opened.
  15. SQL> conn sec/sec
  16. Connected.
  17. SQL>
  18. SQL> desc emp;
  19. ERROR:
  20. ORA-04043: object emp does not exist
  21. SQL>
  22. SQL> conn / as sysdba
  23. Connected.
  24. SQL> create table sec.emp as select * from scott.emp;--从scott里面造测试数据
  25. Table created.
  26. SQL>
  27. SQL> conn sec/sec
  28. Connected.
  29. SQL> select * from emp order by DEPTNO; --检查下造好的数据
  30. EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
  31. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
  32. 7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
  33. 7839 KING       PRESIDENT            17-NOV-81       5000                    10
  34. 7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
  35. 7566 JONES      MANAGER         7839 02-APR-81       2975                    20
  36. 7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
  37. 7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
  38. 7369 SMITH      CLERK           7902 17-DEC-80        800                    20
  39. 7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
  40. 7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
  41. 7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
  42. 7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
  43. EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
  44. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
  45. 7900 JAMES      CLERK           7698 03-DEC-81        950                    30
  46. 7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
  47. 7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
  48. 14 rows selected.
  49. SQL> select DEPTNO,sum(sal) from emp group by DEPTNO; --看好这些数,一些说明用
  50. DEPTNO   SUM(SAL)
  51. ---------- ----------
  52. 30       9400
  53. 20      10875
  54. 10       8750
  55. SQL> select DEPTNO,sum(sal) from emp group by rollup(DEPTNO);
  56. DEPTNO   SUM(SAL)
  57. ---------- ----------
  58. 10       8750
  59. 20      10875
  60. 30       9400
  61. 29025
  62. SQL>
  63. SQL> SELECT
  64. 2    empno,ename,ename,hiredate,sal,deptno,
  65. 3    ratio_to_report(sal) over () as pct1l,
  66. 4    ratio_to_report(sal) over (partition by deptno) as pct2
  67. 5  FROM emp;
  68. EMPNO ENAME      ENAME      HIREDATE         SAL     DEPTNO      PCT1L       PCT2
  69. ---------- ---------- ---------- --------- ---------- ---------- ---------- ----------
  70. 7782 CLARK      CLARK      09-JUN-81       2450         10 .084409991        .28
  71. 7839 KING       KING       17-NOV-81       5000         10 .172265289 .571428571
  72. 7934 MILLER     MILLER     23-JAN-82       1300         10 .044788975 .148571429
  73. 7566 JONES      JONES      02-APR-81       2975         20 .102497847 .273563218
  74. 7902 FORD       FORD       03-DEC-81       3000         20 .103359173 .275862069
  75. 7876 ADAMS      ADAMS      23-MAY-87       1100         20 .037898363 .101149425
  76. 7369 SMITH      SMITH      17-DEC-80        800         20 .027562446 .073563218
  77. 7788 SCOTT      SCOTT      19-APR-87       3000         20 .103359173 .275862069
  78. 7521 WARD       WARD       22-FEB-81       1250         30 .043066322 .132978723
  79. 7844 TURNER     TURNER     08-SEP-81       1500         30 .051679587 .159574468
  80. 7499 ALLEN      ALLEN      20-FEB-81       1600         30 .055124892 .170212766
  81. EMPNO ENAME      ENAME      HIREDATE         SAL     DEPTNO      PCT1L       PCT2
  82. ---------- ---------- ---------- --------- ---------- ---------- ---------- ----------
  83. 7900 JAMES      JAMES      03-DEC-81        950         30 .032730405  .10106383
  84. 7698 BLAKE      BLAKE      01-MAY-81       2850         30 .098191214 .303191489
  85. 7654 MARTIN     MARTIN     28-SEP-81       1250         30 .043066322 .132978723
  86. 14 rows selected.
  87. SQL>
  88. SQL> SELECT
  89. 2    empno,ename,ename,hiredate,sal,deptno,
  90. 3    ratio_to_report(sal) over (partition by deptno order by sal ) as pct2
  91. 4  FROM emp;
  92. ratio_to_report(sal) over (partition by deptno order by sal ) as pct2
  93. *
  94. ERROR at line 3:
  95. ORA-30487: ORDER BY not allowed here

从上面的例子,大家可以看出这个函数的用法了。

结果里面的

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

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

还有ratio_to_report是不支持order by的。

oracle 占比函数的更多相关文章

  1. Oracle LPAD/RPAD函数在处理中文时的注意事项

    首先看下Oracle官方对函数的定义: The RPAD function returns an expression, right-padded to a specified length with ...

  2. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  3. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  4. Oracle日期时间函数大全

    ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...

  5. Oracle过程及函数的参数模式,In、out、in out模式

    Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...

  6. oracle的substr函数的用法

    oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串   substr( string, start_position, [ length ] ) 如:     substr( ...

  7. Oracle nvl(),nvl2()函数介绍

    NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...

  8. oracle wm_concat(column)函数的使用

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...

  9. Oracle之自定义函数

    数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_use ...

随机推荐

  1. [转] Node.js使用MongoDB3.4+Access control is not enabled for the database解决方案

    今天使用MongoDB时遇到了一些问题 建立数据库连接时出现了warnings 出现这个警告的原因是新版本的MongDB为了让我们创建一个安全的数据库 必须要进行验证 后来在外网找到了答案 解决方案如 ...

  2. 2018 UESTC 线段树专题

    A - 一棵简单的线段树 A[1...n]初始全为0. 1. 给两个数p 和 x(1≤p≤n),单点更新 A[p] <- x 2. 给两个数L和R (1≤L<R≤n),  L到R区间里这几 ...

  3. linux查看文件的后几行

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAABiCAIAAACAksEXAAAZuUlEQVR4nO2dzdmzuq6G0wRV0ARNMM

  4. Zabbix监控Low level discovery实时监控网站URL状态

    今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行 ...

  5. 在vue-cli项目中使用bootstrap的方法示例

    在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...

  6. 事件监听addEventListener----attachEvent

    第一:简单的通用方法(IE && FF) window.onload = function(){ var oDiv = document.getElementById("J_ ...

  7. BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...

  8. 《第六周java学习笔记》

    教材知识点总结 Java 把 String 类定义为 final 类. new 运算符首先分配内存空间并在内存空间中放入字符序列,然后计算出引用.(new String(char a[],int st ...

  9. 20165235 祁瑛 2018-4 《Java程序设计》第九周学习总结

    20165235 祁瑛 2018-4 <Java程序设计>第九周学习总结 教材学习内容总结 URL类 UR类是java.net包中的一个重要类,使用URL创建的对象的应用程序称作称作客户端 ...

  10. Python操纵Excel,数据库

    操作excelxlwt:写入excel表格 ,用这个之前需要先导入模块 xlwt: import xlwtxlrd:读取excel,用这个之前需要先导入模块 xlwt:import xlrd 注意:e ...