这个函数在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. Git和Github入门教程

    一.常用命令 所有命令前都要加 git,如表中的init是指 git init.点击命令可直接跳转至本文第一次使用的地方.以下命令都在命令行里执行. 1.本地命令 行为 命令 备注 初始化 init ...

  2. checkbox选中相关问题总结

    html: <input type="checkbox" name="fruit" id="apple">苹果 <inpu ...

  3. javascript 对象(四)

    一.对象概述 对象中包含一系列的属性,这些属性是无序的.每个属性都有一个字符串key和对应的value. var obj={x:1,y:2}; obj.x; obj.y; 1.为什么属性的key必须是 ...

  4. squid,nginx,lighttpd反向代理的区别

    反向代理从传输上分可以分为2种: 1:同步模式(apache-mod_proxy和squid) 2:异步模式(lighttpd 和 nginx) 在nginx的文档说明中,提到了异步传输模式并提到它可 ...

  5. AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆

    原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html 题目传送门 - ARC080 E - Young Maids 题意 给定一个长度为$n$的 ...

  6. .net core cookie登录和session的 DataProtectionProvider 加入 redis

    string redisConnectionString = Configuration.GetSection("Storage:Redis").GetValue<strin ...

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

    20165235 祁瑛 2018-4 <Java程序设计>第八周学习总结 教材学习内容总结 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本.进程是程序的一次动态执行过程,它对 ...

  8. HDU 4635 Strongly connected (强连通分量+缩点)

    <题目链接> 题目大意: 给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边. 解题分析: 我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其 ...

  9. [ 高危 ]mt某站SQL注入

    RANK 24 金币    24 等价RMB  240 与上一漏洞同源所以只有24 数据包: GET /check?clientId=64915 HTTP/1.1 Host: xxx.meituan. ...

  10. Git 日常工作中使用的命令记录

    前言   这篇文章主要是介绍我在使用Git中的有一些忘记了,但是很重要的命令. 20190424 Git 历史信息 username 和 email 更改 git config alias.chang ...