概述今天主要分享Oracle数据库分组函数groupby、rollup、cude、grouping、groupingsets的常用用法。下面以Oracle自带的schema作为演示。1、groupby的使用——根据DEPTNO和JOB进行分组。求具有相同DEPTNO和相同JOB的员工的工资总和。SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYE.DEPTNO,E.JOBORDERBYE.DEPTNO;2、groupbyuserollup()withrollup--可以使用一个或多个参数。意思是从右到左对数据进行汇总统计,生成一行。rollup是一个统计函数。以下是根据分组情况进行的统计,最后总结一下。(1)简单使用rollup--生成一行新数据。(要生成新的一行数据,也可以使用UNIONALL)SELECTD.DUMMYFROMDUALDGROUPBYROLLUP(D.DUMMY);(2)先按照E.DEPTNO,E.JOB分组,然后从右到左依次SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;对于上面使用ROLLUP的结果的理解:a:先按照GROUPBYE.DEPTNO,E.JOB查询9条数据(4、8、12、13除外),根据rollup的定义,从右到左,对ROLLUP中的参数进行小计首先,按照JOB(汇总所有JOB),汇总第4、8、12行,按照E.DEPTNO(汇总所有DEPTNO),汇总第13行的数据排。(3)特例SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.JOB,E.DEPTNO)ORDERBYE.DEPTNO;理解:先根据GROUPBYE.DEPTNO,E.JOB查询前9条数据,然后汇总E.DEPTNO,但是必须考虑JOB所有工资的总和,也就是同一个JOB,所以下面五块的数据出现。3.对多维数据集使用groupbySELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYCUBE(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;理解:CUBE会对每个条件进行单独的条件汇总:对单独的列进行汇总GROUPBYCUBE(E.DEPTNO,E.JOB)先查询数据根据:GROUPBYE.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;您可以使用decode或case函数来转换这种不友好的显示:SELECTCASEWHENgrouping(E.DEPTNO)=1THEN'total'ELSEE.DEPTNO||''ENDASdepartment,CASEWHENgrouping(E.JOB)=1ANDgrouping(E.DEPTNO)=0THEN'小计'ELSEE.JOBENDAS作业类型,SUM(E.SAL)FROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;SELECTDECODE(GROUPING(E.DEPTNO),1,'Total',E.DEPTNO)ASDepartment,CASEWHENGROUPING(E.JOB)=1ANDGROUPING(E.DEPTNO)=0THEN'小计'ELSEE.JOBENDAS作业类型,SUM(E.SAL)FOROMEMPEGROUPBYROLLUP(E.DEPTNO,E.JOB)ORDERBYE.DEPTNO;5.分组集提供根据E.DEPTNO指定汇总集条件的功能,E.JOB单独聚合数据。SELECTE.DEPTNO,E.JOB,SUM(E.SAL)FROMEMPEGROUPBYGROUPINGSETS(E.DEPTNO,E.JOB);
