在oracle里 group by 分组是怎么回事 为什么有时候不加group by说不是单组分组函数?

 我来答
wjq02liu
高粉答主

2020-12-06 · 每个回答都超有意思的
知道大有可为答主
回答量:8813
采纳率:91%
帮助的人:192万
展开全部
概述

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

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);

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
hit_lubin
推荐于2018-04-12 · TA获得超过7889个赞
知道大有可为答主
回答量:1554
采纳率:100%
帮助的人:2001万
展开全部
比如你选一个表的总汇总,比如有一个员工表,里面有员工号,部门号,薪资。
然后你想查所有员工的总薪资,那么使用聚合函数SUM来完成,可是你想想,这个需要分组么?返回结果只有一行,就是表所有行的汇总,所以不需要分组。
而同样这个表,查询每个部门的总薪资,就要按照部门分组了,因为查询的结果是一个部门一行。
GROUP BY肯定是要和聚合函数一起使用的,但是,使用聚合函数,未必就一定分组,因为查询表所有行当中的汇总,或者最大,或者最小值等等,这些是不需要分组的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
在雍和宫哈哈大笑的白茶
2011-07-15 · TA获得超过842个赞
知道小有建树答主
回答量:254
采纳率:100%
帮助的人:188万
展开全部
首先要知道什么是单组分组函数 。 像:sum(),count(),avg()等等 这样做运算的函数 是单组分组函数。

而在使用group by的时候 ,group by 后面添加的字段是所有出现在select 子句中不是这些函数的字段。

比如:
select sum(sal),deptno from emp group by deptno
是算出各部门的总工资数
select ename,deptno from emp group by ename,deptno
如果select子句中没有包含任何函数,那么group by后面添加的字段是所有出现在select 子句中不是这些函数的字段。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flyzhanglin
2011-07-15 · TA获得超过365个赞
知道小有建树答主
回答量:299
采纳率:100%
帮助的人:135万
展开全部
当你的查询语句中有聚合函数(max,min,count,sum)时,就需要用到goup by 分组了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式