oracle 占比函数
这个函数在oracle帮助文档的位置:SQL Reference里面,很好找的。
除报告详细数据外,许多报告中还包括每行总数的百分比。例如,每名客户的订单相对于总订单的百分比,或每位销售代表的销售额相对于总销售额的百分比。
传统上,Oracle计算百分比的方法是在总计报告的子查询中使用SUM函数总计报告,然后把那个结果放到细节表中相除来计算百分比。你还可以用一个子查询作为SELECT语句表达式:
RATIO_TO_REPORT解析函数使得这种类型的查询更容易编码。Oracle 8i中引入了这个函数,它的格式如下:
RATIO_TO_REPORT (expr) OVER (query_partition_clause)
这个上面的语法我就不多说了,直接看演示的例子吧。
- [root@suys1 ~]# su - oracle
- [oracle@suys1 ~]$ sqlplus / as sysdba
- SQL*Plus: Release 11.2.0.4.0 Production on Fri Jun 6 09:00:03 2014
- Copyright (c) 1982, 2013, Oracle. All rights reserved.
- Connected to an idle instance.
- SQL> startup
- ORACLE instance started.
- Total System Global Area 1653518336 bytes
- Fixed Size 2253784 bytes
- Variable Size 1040190504 bytes
- Database Buffers 603979776 bytes
- Redo Buffers 7094272 bytes
- Database mounted.
- Database opened.
- SQL> conn sec/sec
- Connected.
- SQL>
- SQL> desc emp;
- ERROR:
- ORA-04043: object emp does not exist
- SQL>
- SQL> conn / as sysdba
- Connected.
- SQL> create table sec.emp as select * from scott.emp;--从scott里面造测试数据
- Table created.
- SQL>
- SQL> conn sec/sec
- Connected.
- SQL> select * from emp order by DEPTNO; --检查下造好的数据
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
- 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
- 7839 KING PRESIDENT 17-NOV-81 5000 10
- 7934 MILLER CLERK 7782 23-JAN-82 1300 10
- 7566 JONES MANAGER 7839 02-APR-81 2975 20
- 7902 FORD ANALYST 7566 03-DEC-81 3000 20
- 7876 ADAMS CLERK 7788 23-MAY-87 1100 20
- 7369 SMITH CLERK 7902 17-DEC-80 800 20
- 7788 SCOTT ANALYST 7566 19-APR-87 3000 20
- 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
- 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
- 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
- 7900 JAMES CLERK 7698 03-DEC-81 950 30
- 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
- 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
- 14 rows selected.
- SQL> select DEPTNO,sum(sal) from emp group by DEPTNO; --看好这些数,一些说明用
- DEPTNO SUM(SAL)
- ---------- ----------
- 30 9400
- 20 10875
- 10 8750
- SQL> select DEPTNO,sum(sal) from emp group by rollup(DEPTNO);
- DEPTNO SUM(SAL)
- ---------- ----------
- 10 8750
- 20 10875
- 30 9400
- 29025
- SQL>
- SQL> SELECT
- 2 empno,ename,ename,hiredate,sal,deptno,
- 3 ratio_to_report(sal) over () as pct1l,
- 4 ratio_to_report(sal) over (partition by deptno) as pct2
- 5 FROM emp;
- EMPNO ENAME ENAME HIREDATE SAL DEPTNO PCT1L PCT2
- ---------- ---------- ---------- --------- ---------- ---------- ---------- ----------
- 7782 CLARK CLARK 09-JUN-81 2450 10 .084409991 .28
- 7839 KING KING 17-NOV-81 5000 10 .172265289 .571428571
- 7934 MILLER MILLER 23-JAN-82 1300 10 .044788975 .148571429
- 7566 JONES JONES 02-APR-81 2975 20 .102497847 .273563218
- 7902 FORD FORD 03-DEC-81 3000 20 .103359173 .275862069
- 7876 ADAMS ADAMS 23-MAY-87 1100 20 .037898363 .101149425
- 7369 SMITH SMITH 17-DEC-80 800 20 .027562446 .073563218
- 7788 SCOTT SCOTT 19-APR-87 3000 20 .103359173 .275862069
- 7521 WARD WARD 22-FEB-81 1250 30 .043066322 .132978723
- 7844 TURNER TURNER 08-SEP-81 1500 30 .051679587 .159574468
- 7499 ALLEN ALLEN 20-FEB-81 1600 30 .055124892 .170212766
- EMPNO ENAME ENAME HIREDATE SAL DEPTNO PCT1L PCT2
- ---------- ---------- ---------- --------- ---------- ---------- ---------- ----------
- 7900 JAMES JAMES 03-DEC-81 950 30 .032730405 .10106383
- 7698 BLAKE BLAKE 01-MAY-81 2850 30 .098191214 .303191489
- 7654 MARTIN MARTIN 28-SEP-81 1250 30 .043066322 .132978723
- 14 rows selected.
- SQL>
- SQL> SELECT
- 2 empno,ename,ename,hiredate,sal,deptno,
- 3 ratio_to_report(sal) over (partition by deptno order by sal ) as pct2
- 4 FROM emp;
- ratio_to_report(sal) over (partition by deptno order by sal ) as pct2
- *
- ERROR at line 3:
- 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 占比函数的更多相关文章
- Oracle LPAD/RPAD函数在处理中文时的注意事项
首先看下Oracle官方对函数的定义: The RPAD function returns an expression, right-padded to a specified length with ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- 重写Oracle的wm_concat函数,自定义分隔符、排序
oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...
- Oracle日期时间函数大全
ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- oracle的substr函数的用法
oracle的substr函数的用法 取得字符串中指定起始位置和长度的字符串 substr( string, start_position, [ length ] ) 如: substr( ...
- Oracle nvl(),nvl2()函数介绍
NVL函数 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:如果string1为NULL,则NVL函数返回replace_with的值, ...
- oracle wm_concat(column)函数的使用
oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...
- Oracle之自定义函数
数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_use ...
随机推荐
- [转] Node.js使用MongoDB3.4+Access control is not enabled for the database解决方案
今天使用MongoDB时遇到了一些问题 建立数据库连接时出现了warnings 出现这个警告的原因是新版本的MongDB为了让我们创建一个安全的数据库 必须要进行验证 后来在外网找到了答案 解决方案如 ...
- 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区间里这几 ...
- linux查看文件的后几行
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAABiCAIAAACAksEXAAAZuUlEQVR4nO2dzdmzuq6G0wRV0ARNMM
- Zabbix监控Low level discovery实时监控网站URL状态
今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行 ...
- 在vue-cli项目中使用bootstrap的方法示例
在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...
- 事件监听addEventListener----attachEvent
第一:简单的通用方法(IE && FF) window.onload = function(){ var oDiv = document.getElementById("J_ ...
- BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...
- 《第六周java学习笔记》
教材知识点总结 Java 把 String 类定义为 final 类. new 运算符首先分配内存空间并在内存空间中放入字符序列,然后计算出引用.(new String(char a[],int st ...
- 20165235 祁瑛 2018-4 《Java程序设计》第九周学习总结
20165235 祁瑛 2018-4 <Java程序设计>第九周学习总结 教材学习内容总结 URL类 UR类是java.net包中的一个重要类,使用URL创建的对象的应用程序称作称作客户端 ...
- Python操纵Excel,数据库
操作excelxlwt:写入excel表格 ,用这个之前需要先导入模块 xlwt: import xlwtxlrd:读取excel,用这个之前需要先导入模块 xlwt:import xlrd 注意:e ...