这个函数在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. Top 查看某些或者某个进程(top -p pid)

    https://blog.csdn.net/zhangfn2011/article/details/7488746?utm_source=blogxgwz5

  2. 剑指offer错题记录

    错误重点: 1. 传递vector参数时,如果调用函数改变了vector的内容,一定一定要&,传引用保持一致 旋转数组的最小数字:有重复数字情况,二分查找照样搞.情况考虑要周全,当a[mid] ...

  3. sql select中加入常量列

    string sql="select a,b,'常量' as c from table" 注:单引号' ' 很重要,否则编译时会把其看成查询参数,从而提示参数未指定错误

  4. eclipse发布web

    elipse集成tomcat 在实际开发中通常在eclipse中集成tomcat,这样在开发中更方便一些.打开eclipse,选择界面下方的servers选项,点击no servers are ava ...

  5. CSS改变插入光标颜色caret-color

    CSS代码: input { color: #333; caret-color: red; } @supports (-webkit-mask: none) and (not (caret-color ...

  6. IDEA创建javaSE项目

  7. Linux 常用基本指令

    1.ls 参数: -a:列出所有目录(“.”开头的是隐藏文件) -l: 以长格式列出目录下的内容列表 2.cd cd  切换到家目录 cd ~ 切换到家目录 cd .. 切换到上一级目录 3.pwd ...

  8. Mysql 查询实现成绩排名

    Mysql 查询实现成绩排名,相同分数名次相同,类似于rank()函数 近日系统要实现总分成绩排名,而且相同分数的学生排名要一样,在网上搜了一圈,没有找到合适的方法,只能靠自己实现了,这里提供两种方法 ...

  9. 上海市2019年公务员录用考试第一轮首批面试名单(B类)

    上海市2019年公务员录用考试第一轮首批面试名单(B类) 2019-03-12 设置字体:大 中 小 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 1910565 5 ...

  10. type__列表