oracle条件怎么分组,oracle的分组函数

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

概述

创新互联公司-专业网站定制、快速模板网站建设、高性价比兖州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式兖州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖兖州地区。费用合理售后完善,十多年实体公司更值得信赖。

今天主要分享下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方面的内容,感兴趣的朋友可以关注下~

oracle分组统计(group)

select pkdz.id ,zsmx.id as zsmxid,pzty.typh_q, pzty.typh_z, pzty.szsk, skxx.swjgid,zsmx.je from pz_pztyjl pzty

join pz_pkdzjl pkdz on (pzty.pkdzjl_id = pkdz.id )

join sk_hd_zsmx zsmx on ( pkdz.id = zsmx.tyjks_id )

join sk_zt_skxx skxx on (zsmx.skxx_id = skxx.id)

order by pkdz.id asc, zsmx.id asc

求助 oracle 一张表多个条件分组查询

select pid,

sum(case when type=0 then 1 else 0 end) type_0,

sum(case when type=1 then 1 else 0 end) type_1,

sum(case when type=2 then 1 else 0 end) type_2

from A

group by pid

oracle怎么根据一个数分组

首先你的starttime是什么类型的,数字?字符?还是时间?

要出来08:00-08:30这种结果简单,只要查询的时候加一个关联就可以,

比如select starttime||'-'||endtime from table.当然试过是时间的字段类型,比如date什么的,那就转换成字符型的,反正现在看来主要是字符型。

再说分组,分组可以用case when手动分组。

按照你给的图片个人觉得可以这么分

select case when starttime=0800 and endtime=10:00 then 1

when starttime=0900 and endtime=12:00 then 2

when starttime=1330 and endtime=15:30 then 3

when starttime=1530 and endtime=17:30 then 4

end 分组, starttime||'-'||endtime from table

这个语句中的具体写法,可能会因为数据类型的原因什么的,导致语句不能直接用,需要转换一下数据类型,但是大体上的意思和写法就是这样了。

oracle sql 两张表条件查询且分组

select a.xiaoqu ,a.danjia from esf a, esfjj  b where a.xiaoqu = b. xiaoqu and a.danjia  0.95*b.junjia group by a.xiaoqu,a.danjia


分享标题:oracle条件怎么分组,oracle的分组函数
本文地址:http://azwzsj.com/article/phsici.html