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 ...
随机推荐
- Git和Github入门教程
一.常用命令 所有命令前都要加 git,如表中的init是指 git init.点击命令可直接跳转至本文第一次使用的地方.以下命令都在命令行里执行. 1.本地命令 行为 命令 备注 初始化 init ...
- checkbox选中相关问题总结
html: <input type="checkbox" name="fruit" id="apple">苹果 <inpu ...
- javascript 对象(四)
一.对象概述 对象中包含一系列的属性,这些属性是无序的.每个属性都有一个字符串key和对应的value. var obj={x:1,y:2}; obj.x; obj.y; 1.为什么属性的key必须是 ...
- squid,nginx,lighttpd反向代理的区别
反向代理从传输上分可以分为2种: 1:同步模式(apache-mod_proxy和squid) 2:异步模式(lighttpd 和 nginx) 在nginx的文档说明中,提到了异步传输模式并提到它可 ...
- AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆
原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html 题目传送门 - ARC080 E - Young Maids 题意 给定一个长度为$n$的 ...
- .net core cookie登录和session的 DataProtectionProvider 加入 redis
string redisConnectionString = Configuration.GetSection("Storage:Redis").GetValue<strin ...
- 20165235 祁瑛 2018-4 《Java程序设计》第八周学习总结
20165235 祁瑛 2018-4 <Java程序设计>第八周学习总结 教材学习内容总结 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本.进程是程序的一次动态执行过程,它对 ...
- HDU 4635 Strongly connected (强连通分量+缩点)
<题目链接> 题目大意: 给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边. 解题分析: 我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其 ...
- [ 高危 ]mt某站SQL注入
RANK 24 金币 24 等价RMB 240 与上一漏洞同源所以只有24 数据包: GET /check?clientId=64915 HTTP/1.1 Host: xxx.meituan. ...
- Git 日常工作中使用的命令记录
前言 这篇文章主要是介绍我在使用Git中的有一些忘记了,但是很重要的命令. 20190424 Git 历史信息 username 和 email 更改 git config alias.chang ...