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 ...
随机推荐
- Top 查看某些或者某个进程(top -p pid)
https://blog.csdn.net/zhangfn2011/article/details/7488746?utm_source=blogxgwz5
- 剑指offer错题记录
错误重点: 1. 传递vector参数时,如果调用函数改变了vector的内容,一定一定要&,传引用保持一致 旋转数组的最小数字:有重复数字情况,二分查找照样搞.情况考虑要周全,当a[mid] ...
- sql select中加入常量列
string sql="select a,b,'常量' as c from table" 注:单引号' ' 很重要,否则编译时会把其看成查询参数,从而提示参数未指定错误
- eclipse发布web
elipse集成tomcat 在实际开发中通常在eclipse中集成tomcat,这样在开发中更方便一些.打开eclipse,选择界面下方的servers选项,点击no servers are ava ...
- CSS改变插入光标颜色caret-color
CSS代码: input { color: #333; caret-color: red; } @supports (-webkit-mask: none) and (not (caret-color ...
- IDEA创建javaSE项目
- Linux 常用基本指令
1.ls 参数: -a:列出所有目录(“.”开头的是隐藏文件) -l: 以长格式列出目录下的内容列表 2.cd cd 切换到家目录 cd ~ 切换到家目录 cd .. 切换到上一级目录 3.pwd ...
- Mysql 查询实现成绩排名
Mysql 查询实现成绩排名,相同分数名次相同,类似于rank()函数 近日系统要实现总分成绩排名,而且相同分数的学生排名要一样,在网上搜了一圈,没有找到合适的方法,只能靠自己实现了,这里提供两种方法 ...
- 上海市2019年公务员录用考试第一轮首批面试名单(B类)
上海市2019年公务员录用考试第一轮首批面试名单(B类) 2019-03-12 设置字体:大 中 小 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 1910565 5 ...
- type__列表