博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle rollup()
阅读量:4617 次
发布时间:2019-06-09

本文共 2606 字,大约阅读时间需要 8 分钟。

1、group by的使用

--根据DEPTNO和JOB进行分组。求相同DEPTNO,相同JOB的员工工资总和。

SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY E.DEPTNO,E.JOB ORDER BY E.DEPTNO
复制代码

结果:

2、group by 配合rollup的使用

rollup()--可以使用一个或者多个参数。意思是从右向左进行数据的汇总统计,并生成一行,rollup是个统计函数。

是根据分组情况进行统计,最终进行全部汇总。

(1)、简单的使用rollup--生成一行新数据。(要生成新的一行数据,还可以使用UNION ALL)

1 SELECT D.DUMMY FROM DUAL D 2 GROUP BY ROLLUP(D.DUMMY)
复制代码

结果:

         

(2)先根据E.DEPTNO,E.JOB进行分组,根据从右向左的条件,

1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) 2 ORDER BY E.DEPTNO
复制代码

结果:

针对以上的使用ROLLUP的结果的理解:

a:首先根据GROUP BY E.DEPTNO,E.JOB查询出9条数据(除4,8,12,13外),在根据rollup的定义:

从右向左,对ROLLUP中的参数进行小计:

首先根据JOB(对所有的JOB进行汇总),汇总出4,8,12行,在根据E.DEPTNO(对所有的DEPTNO进行汇总),汇总出

第十三行数据。

例如:GROUP BY ROLLUP(E.DEPTNO,E.JOB,E.ENAME)---

首先:根据GROUP BY(E.DEPTNO,E.JOB,E.ENAME),查询,

其次:E.ENAME--汇总,相同DEPTNO和相同的JOB

再次:E.JOB--汇总,相同的部门

最后:E.DEPTNO--汇总

可以实际操作理解其意义。

rollup(a,b)   统计列包含:(a,b)、(a)、()

rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()

 (3)、特殊情况-----

1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) 2 ORDER BY E.DEPTNO
复制代码

结果:

理解:首先根据

GROUP BY E.DEPTNO,E.JOB查询出前九条数据,

其次:对E.DEPTNO进行汇总,但是必须考虑JOB,也就是

相同的JOB,的所有的工资总和:

所以出现下面五条数据。

 3、group by 配合cube的使用

1 SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY CUBE(E.DEPTNO,E.JOB) 2 ORDER BY E.DEPTNO
复制代码

理解:CUBE会对条件中的每一个条件进行单独的汇总:即对单独的列进行汇总

GROUP BY CUBE(E.DEPTNO,E.JOB)

首先根据:GROUP BY E.DEPTNO,E.JOB查询数据

其次:对E.JOB进行汇总(不考虑DEPTNO,单独汇总,而ROLLUP是在同一个DEPTNO下面)

再次::对E.DEPTNO进行汇总

最后,全部汇总

 cube(a,b)     统计列包含:(a,b)、(a)、(b)、()

 cube(a,b,c)   统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

3、GROUPING 的使用

GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

1 SELECT GROUPING(E.DEPTNO), E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) 2 ORDER BY E.DEPTNO
复制代码

结果:

可以使用decode或者case函数进行转换这种不友好的显示:

1 SELECT  2 CASE WHEN grouping(E.DEPTNO) = 1  3 THEN '总计'  4 ELSE E.DEPTNO || ''  5 END AS 部门,  6 CASE WHEN grouping(E.JOB) = 1 AND grouping(E.DEPTNO) = 0  7 THEN '小计'  8 ELSE E.JOB  9 END AS 工作种类, 10 SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) 11 ORDER BY E.DEPTNO
复制代码

结果:

1 SELECT DECODE(GROUPING(E.DEPTNO), 1, '总计', E.DEPTNO) AS 部门,  2 CASE  3 WHEN GROUPING(E.JOB) = 1 AND GROUPING(E.DEPTNO) = 0 THEN  4 '小计'  5 ELSE  6 E.JOB  7 END AS 工作种类,  8 SUM(E.SAL)  9 FROM EMP E 10 GROUP BY ROLLUP(E.DEPTNO, E.JOB) 11 ORDER BY E.DEPTNO
复制代码

结果:

grouping sets提供了指定汇总集合条件的功能。

SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY GROUPING SETS(E.DEPTNO,E.JOB)

结果:--根据E.DEPTNO,E.JOB分别汇总数据

 

转载于:https://www.cnblogs.com/hx8023zx/archive/2012/01/09/2316825.html

你可能感兴趣的文章
BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
查看>>
BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
查看>>
2016.10.24 继续学习
查看>>
产品功能对标 - 服务授权管理
查看>>
各地IT薪资待遇讨论
查看>>
splay入门
查看>>
带CookieContainer进行post
查看>>
C语言学习笔记--字符串
查看>>
CSS-上下文选择器
查看>>
ionic repeat 重复最后一个时要执行某个函数
查看>>
1.初识代码审计-基础
查看>>
[Vue-rx] Stream an API using RxJS into a Vue.js Template
查看>>
解决VC几个编译问题的方法——好用
查看>>
SPOJ #11 Factorial
查看>>
City Upgrades
查看>>
“人少也能办大事”---K2 BPM老客户交流会
查看>>
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>