Oracle增强型分组函数

ROLLUP()函数是对于GROUP BY 分组统计的功能扩展,可以实现分组统计求和的效果。

下面我们开始准备我们的试验的环境

--创建新表employee_salary,存储数据来自用户hr.employees

SQL>CREATE TABLE employee_salary ASSELECT E.FIRST_NAME,E.JOB_ID,E.MANAGER_ID,E.SALARY FROM HR.EMPLOYEES E WHERE E.JOB_ID=‘IT_PROG‘;
--查看新创建的表

SQL>SELECT * FROM employee_salary;

--显示效果如下

FIRST_NAME    JOB_ID      MANAGER_ID     SALARY

-------------------- ---------- --------------------------------

Alexander       IT_PROG        102         9000.00

Bruce             IT_PROG        103          6000.00

David             IT_PROG        103          4800.00

Valli               IT_PROG        103          4800.00

Diana             IT_PROG        103         4200.00

--首先按照JOB_ID进行分组,查看salary和

SQL>SELECT sa.job_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.job_id;

--显示效果如下

JOB_ID      SUM(SA.SALARY)

---------- -----------------------

IT_PROG          28800

--按照MANAGER_ID进行分组,查看salary和

SELECT sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.manager_id;

--显示效果如下

MANAGER_ID    SUM(SA.SALARY)

---------- ----------------------------

102                      9000

103                    19800

--我们使用ROLLUP函数看看是什么效果

SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY ROLLUP(sa.job_id,sa.manager_id);

--显示效果如下

JOB_ID     MANAGER_ID  SUM(SA.SALARY)

---------- ---------- --------------------------------

IT_PROG       102           9000

IT_PROG       103          19800

IT_PROG                      28800

28800

说明:ROLLUP解析过程,以ROLLUP(a,b)为例

ROLLUP(a,b)== GROUP(a,b) UNION ALL GROUP(a) UNIONALL GROUP()

即:解析顺序是从右至左,显示按照a,b分组,接下来是按照a分组,最后是对全表分组;

上面ROLLUP (sa.job_id,sa.manager_id)等同下面UNION ALL的集合操作

SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa

GROUP BY sa.job_id,sa.manager_id

UNION ALL

SELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary sa

GROUP BY sa.job_id

UNION ALL

SELECT NULL,NULL,SUM(sa.salary) FROM employee_salary sa GROUP BY()

ORDER BY 1,2;

--显示效果如下

JOB_ID     MANAGER_ID  SUM(SA.SALARY)

---------- ---------- --------------------------------

IT_PROG       102                9000

IT_PROG       103               19800

IT_PROG                            28800

28800

说明:虽然最后展示的效果是相同的,但是ROLLUP()函数的执行效率要比UNION ALL的效率要高、要快。

ROLLUP(A,B,C)是在执行组合操作,无顺序,组合公式是(n+1),当n=3时,组合结果就是有4个。

ROLLUP()中的参数位置不同,得出的结果可能不一样!

在理解ROLLUP的基础上再来理解CUBE()就比较容易,ROLLUP()在执行组合操作,CUBE()就是在执行排序动作,从左至右,排序公式是2N次方。

CUBE(A,B,C)==GROUP BY (A,B,C) UNION ALL GROUP BY (A,B) UNION ALL GROUP BY (A,C) UNION ALL GROUPBY (A) UNION ALL GROUP BY (B) UNION ALL GROUP BY (C) UNION ALL GROUP BY ()

例如:执行下列语句

SQL> SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY CUBE(sa.job_id,sa.manager_id);

--显示效果如下

JOB_ID    MANAGER_ID SUM(SA.SALARY)

---------- ---------- -----------------------------

28800

102                   9000

103                 19800

IT_PROG                              28800

IT_PROG        102                   9000

IT_PROG        103                  19800

6 rows selected

上面的语句等同执行下列语句

SQL>SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY (sa.job_id,sa.manager_id)

UNION ALL

SELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary sa

GROUP BY (sa.job_id)

UNION ALL

SELECT NULL,sa.manager_id,SUM(sa.salary) FROM employee_salary sa

GROUP BY (sa.manager_id)

UNION ALL

SELECT NULL,NULL,SUM(sa.salary) FROM employee_salary sa

GROUPBY ();

关于GROUPING

GROUPING(A)用于判断对于分组后的列是否是空值NULL,返回值有0和1两个值,1表示,该列为空——NULL,这个NULL值是因为分组时产生,否则则为0;

时间: 2024-10-11 23:03:58

Oracle增强型分组函数的相关文章

[转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用法,这些函数可以理解为GroupBy分组函数封装后的精简用法,相当于多个union all 的组合显示效果,但是要比 多个union all的效率要高. 其实这些函数在时间的程序开发中应用的并不多,至少在我工作的多年时间中没用过几次,因为现在的各种开发工具/平台都自带了这些高级分组统计功能,使用的方

Oracle之分组函数嵌套以及表连接

--1 数据环境准备 scott 用户下面的emp,dept表 --2 要求 :求平均工资最高的部门编号,部门名称,部门平均工资 select d.deptno,d.dname,e.salfrom(select avg(sal) sal,deptnofrom emp egroup by deptnohaving avg(sal) = (select max(avg(sal)) from emp group by deptno))eleft join dept don e.deptno=d.dep

Oracle增强型日期函数

--修改数据库时区为东八区 ALTER DATABASE SET TIME_ZONE='+08:00'; /* 在修改过程中可能会出现错误提示:ORA-30079: 当数据库有TIMESTAMP WITH LOCAL TIMEZONE列时不能变更数据库时区 这是因为当前数据库中已有的表中存在列,列的类型定义为了TIMESTAMP WITH LOCAL TIME ZONE 所以数据库不允许修改数据库时区 接下来需要通过语句找到是哪些表的列引起的这个问题,查询语句如下: **/ --检查是否有影响修

ORACLE分组函数stddev和variance,我心存的疑问

方差函数VARIANCE(x),具体方法是: 设方差s,a为x1,x2...xn的平均值 ,则s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n 标准差函数STDDEV(x),具体算法是: 方差开方.设标准查为& ,则 &^2 = s 但是我通过以下的实验,发现oracle是这样计算variance()的, s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n-1 ,注意不是除以n,而是n-1 ---------

[转]【ROLLUP】Oracle分组函数之ROLLUP魅力

原创:http://blog.itpub.net/519536/viewspace-610995 本文通过演示给出Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅力.ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法,这里同时给出ROLLUP的Group By的改写思路. 1.初始化实验坏境1)创建测试表group_test[email protected]> create table group_test (group_id int,

Oracle基本语法&&函数&&子查询&&分页查询&&排序&&集合操作&&高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

Oracle的“ORA-00937: 不是单组分组函数” 如何解决?

之前在编写oracle的sql语句时遇到这个问题,这里做个记录 问题描述:ORA-00937: 不是单组分组函数 问题原因:select语句中又在查询某一列的值,其中还有聚合函数 原先本人编写SQL是这样的 --查找配送单的收货配送点.送货配送点.配送包数量-- select R_DELIVEPOINT_ID,S_DELIVEPOINT_ID,SUM(PACK_NUM) PACK_NUM from TMS_DELIVERY; 其中,用到聚合函数SUM(),执行时导致这个问题 如果要解决这个问题,

Oracle学习(4):分组函数

分组函数 什么是分组函数? 分组函数作用于一组数据,并对一组数据返回一个值 组函数的类型 lAVG lCOUNT lMAX lMIN lSUM 数值求和 SQL> --求员工工资总额 SQL> select sum(sal) from emp; SUM(SAL) ---------- 29025 求数据条数 SQL> --求员工的人数 SQL> select count(*)from emp; COUNT(*) ---------- 14 求平均 SQL> --平均工资 SQ

Oracle - 查询语句 - 分组函数

/* 分组函数 不能再select子句中出现普通的列,除非这个列在group by中给出 所有的空值都会被分为一组 分组过滤 SELECT FROM WHERE GROUPBY HAVING ORDERBY */ --求出每种工作的平均薪资 SELECT JOB,AVG(SAL),MAX(SAL),MIN(SAL) FROM EMP GROUP BY JOB; SELECT MAX(SAL) FROM EMP; SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY D