1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

概述

今天主要分享下Oracle数据库分组函数group by 、 rollup、cude、grouping 、grouping sets的常用用法,以下以Oracle自带schema做演示。

1、group by的使用

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

SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYE.DEPTNO,E.JOBORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

2、group by 配合rollup的使用

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

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

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

SELECTD.DUMMYFROMDUALDGROUPBYROLLUP(D.DUMMY);

超详细的5个Oracle数据库分组函数总结

(2)先根据E.DEPTNO,E.JOB进行分组,然后从右向左

SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

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

a:首先根据GROUP BY E.DEPTNO,E.JOB查询出9条数据(除4,8,12,13外),在根据rollup的定义,从右向左,对ROLLUP中的参数进行小计

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

(3) 特殊情况

SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.JOB,E.DEPTNO)ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

理解:首先根据GROUP BY E.DEPTNO,E.JOB查询出前九条数据,其次对E.DEPTNO进行汇总,但是必须考虑JOB,也就是相同的JOB,的所有的工资总和,所以出现下面五条数据。

3、group by 配合cube的使用

SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYCUBE(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

理解: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)、()

4、GROUPING 的使用

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

SELECTGROUPING(E.DEPTNO),E.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

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

SELECT
CASEWHENgrouping(E.DEPTNO)=1
THEN'总计'
ELSEE.DEPTNO||''
ENDAS部门,
CASEWHENgrouping(E.JOB)=1ANDgrouping(E.DEPTNO)=0
THEN'小计'
ELSEE.JOB
ENDAS工作种类,
SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)
ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

SELECTDECODE(GROUPING(E.DEPTNO),1,'总计',E.DEPTNO)AS部门,
CASE
WHENGROUPING(E.JOB)=1ANDGROUPING(E.DEPTNO)=0THEN
'小计'
ELSE
E.JOB
ENDAS工作种类,
SUM(E.SAL)
FROMEMPE
GROUPBYROLLUP(E.DEPTNO,E.JOB)
ORDERBYE.DEPTNO;

超详细的5个Oracle数据库分组函数总结

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

根据E.DEPTNO,E.JOB分别汇总数据。

SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYGROUPINGSETS(E.DEPTNO,E.JOB);

超详细的5个Oracle数据库分组函数总结


本文来源:1818IP

本文地址:https://www.1818ip.com/post/10888.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。