这个函数在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. Vue2.0 探索之路——生命周期和钩子函数的一些理解

    前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什 ...

  2. [转] 跨域资源共享 CORS 详解

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  3. 1419: Red is good

    题解: 很简单的期望dp 转移方程显然,max一个0就可以了 #include <bits/stdc++.h> using namespace std; #define rep(i,h,t ...

  4. java抽象类详解

    前言 在没讲抽象类之前  我们先来看看 final关键字 final 修饰符 可以修饰 类.属性.方法 修饰类时  表示该类不能被继承   其他特征 跟普通的类一样 修饰 属性时 表示 改属性不能改变 ...

  5. 浅析H5图片上传

    概述 最近需求上需要实现图片上传的功能,简单记录下实现过程.目前实现的功能比较简单,主要有以下几点: 图片预览 图片删除 拖拽上传 压缩上传 移动端实现方案:使用File API 主要使用到 File ...

  6. Codeforces 837F Prefix Sums

    Prefix Sums 在 n >= 4时候直接暴力. n <= 4的时候二分加矩阵快速幂去check #include<bits/stdc++.h> #define LL l ...

  7. docker inspect命令

    docker inspect -f {{.NetworkSettings.Networks.crawling_pro.NetworkID}} crawling_internationalmacro_p ...

  8. BZOJ3772 精神污染 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3772 题意概括 给出一个树,共n个节点. 有m条互不相同的树上路径. 现在让你随机选择2条路径,问 ...

  9. LeetCode 237. 删除链表中的节点

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  10. scrapy选择器归纳

    python 爬虫: srcrapy框架xpath和css选择器语法 Xpath基本语法 一.常用的路径表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 //div ...