共计 2215 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章给大家介绍 Oracle 数据库中有哪些分组函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
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)
SELECT D.DUMMY FROM DUAL D GROUP BY ROLLUP(D.DUMMY);
(2)先根据 E.DEPTNO,E.JOB 进行分组,然后从右向左
SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) 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 进行汇总), 汇总出第十三行数据。
(3) 特殊情况
SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.JOB,E.DEPTNO) ORDER BY E.DEPTNO;
理解:首先根据 GROUP BY E.DEPTNO,E.JOB 查询出前九条数据,其次对 E.DEPTNO 进行汇总,但是必须考虑 JOB,也就是相同的 JOB,的所有的工资总和,所以出现下面五条数据。
3、group by 配合 cube 的使用
SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY CUBE(E.DEPTNO,E.JOB) 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)、()
4、GROUPING 的使用
GROUPING 函数可以接受一列,返回 0 或者 1。如果列值为空,那么 GROUPING()返回 1;如果列值非空,那么返回 0。GROUPING 只能在使用 ROLLUP 或 CUBE 的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。
SELECT GROUPING(E.DEPTNO), E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) ORDER BY E.DEPTNO;
可以使用 decode 或者 case 函数进行转换这种不友好的显示:
SELECT CASE WHEN grouping(E.DEPTNO) = 1 THEN 总计 ELSE E.DEPTNO || END AS 部门, CASE WHEN grouping(E.JOB) = 1 AND grouping(E.DEPTNO) = 0 THEN 小计 ELSE E.JOB END AS 工作种类, SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO,E.JOB) ORDER BY E.DEPTNO;
SELECT DECODE(GROUPING(E.DEPTNO), 1, 总计 , E.DEPTNO) AS 部门, CASE WHEN GROUPING(E.JOB) = 1 AND GROUPING(E.DEPTNO) = 0 THEN 小计 ELSE E.JOB END AS 工作种类, SUM(E.SAL) FROM EMP E GROUP BY ROLLUP(E.DEPTNO, E.JOB) ORDER BY E.DEPTNO;
5、grouping sets 提供了指定汇总集合条件的功能
根据 E.DEPTNO,E.JOB 分别汇总数据。
SELECT E.DEPTNO,E.JOB,SUM(E.SAL) FROM EMP E GROUP BY GROUPING SETS(E.DEPTNO,E.JOB);
关于 Oracle 数据库中有哪些分组函数就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。