这个函数在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. EF大数据批量处理 EntityFrameWork下增加扩展方法

    为EF操作方法添加扩展方法 BulkInsert 大致设计方式为 通过当前DbContext 获取当前连接字符串,调用连接字符串获取当前实体的所有字段及字段属性,映射到DataTable中 在调用Sy ...

  2. JavaScript动态加载CSS和JS文件

    var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argumen ...

  3. URL地址编码和解码

    0. 参考 [整理]关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode) python3中的urlopen对于中文url是如何处理的? 中文URL的编码问题 ...

  4. web前端中navigator

    <script> if(navigator.cookieEnabled){ document.write("浏览器已启用cookie,请妥善保存个人信息"); }els ...

  5. windows快速进入安装目录

    ctrl+R 输入%LOCALAPPDATA%\+应用名字 %LOCALAPPDATA%\composer

  6. PHP加密解密方法,使用openssl加密解密

    /** * des 加密算法 */ function do_mencrypt($input, $key) { if (!function_exists("mcrypt_module_open ...

  7. BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演

    原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...

  8. 不利用C语言库函数,实现字符串相关函数

    #include<stdio.h> int strLength(char* s)//求字符长度 { ; while(s[i]!=NULL) { i++; } return i; } int ...

  9. Splay的初步学习

    具体是啥,qwq 有时间再补吧,贴一下代码: #include<iostream> #include<cstdio> #include<cstring> #incl ...

  10. MII接口简介

    Standard MII总共使用了15根线,外加2根MDIO线,如果要扩展PHY芯片,这些线除了其中两根(应该是TXCLK和RXCLK)以外都是不可共用的:而Reduce Media Independ ...