扩展了的group by子句.我们都知道,group by子句用于将查询结果分组。 下面是未扩展的group by子句 SQL> select job,sum(sal) 2 from emp 3 group by job; JOB SUM(SAL) --------- ---------- ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 -- 扩展了的group by子句。 1.rollup子句 作用:为每一个分组返回一条小计录,并为全部分组返回总计。 可以向rollup中传递一列或者多列,rollup可以结合聚合函数一起使用。 实例1: select job,empno,sum(sal) from emp group by rollup(job,empno); -- JOB EMPNO SUM(SAL) --------- ----- ---------- CLERK 7900 950 CLERK 7369 800 CLERK 7876 1100 CLERK 7934 1300 CLERK 4150 ANALYST 7788 3000 ANALYST 7902 3000 ANALYST 6000 MANAGER 7566 2975 MANAGER 7698 2850 MANAGER 7782 2450 MANAGER 8275 SALESMAN 7499 1600 SALESMAN 7521 1250 SALESMAN 7654 1250 SALESMAN 7844 1500 SALESMAN 5600 PRESIDENT 7839 5000 PRESIDENT 5000 29025 实例2: select job,empno,avg(sal) from emp group by rollup(job,empno); -- JOB EMPNO AVG(SAL) --------- ----- ---------- CLERK 7900 950 CLERK 7369 800 CLERK 7876 1100 CLERK 7934 1300 CLERK 1037.5 ANALYST 7788 3000 ANALYST 7902 3000 ANALYST 3000 MANAGER 7566 2975 MANAGER 7698 2850 MANAGER 7782 2450 MANAGER 2758.33333 SALESMAN 7499 1600 SALESMAN 7521 1250 SALESMAN 7654 1250 SALESMAN 7844 1500 SALESMAN 1400 PRESIDENT 7839 5000 PRESIDENT 5000 2073.21428 2.cube子句 作用:返回cube中所有列组合的小计信息,同时在最后显示总计信息。 实例1: select job,sum(sal) from emp group by cube(job); -- JOB SUM(SAL) --------- ---------- 29025 CLERK 4150 ANALYST 6000 MANAGER 8275 SALESMAN 5600 PRESIDENT 5000 实例2: select empno,job,avg(sal) from emp group by cube(empno,job); -- EMPNO JOB AVG(SAL) ----- --------- ---------- 2073.21428 CLERK 1037.5 ANALYST 3000 MANAGER 2758.33333 SALESMAN 1400 PRESIDENT 5000 7900 950 7900 CLERK 950 7369 800 7369 CLERK 800 7499 1600 7499 SALESMAN 1600 7521 1250 7521 SALESMAN 1250 7566 2975 7566 MANAGER 2975 7654 1250 7654 SALESMAN 1250 7698 2850 7698 MANAGER 2850 7782 2450 7782 MANAGER 2450 7788 3000 7788 ANALYST 3000 7839 5000 7839 PRESIDENT 5000 7844 1500 7844 SALESMAN 1500 7876 1100 7876 CLERK 1100 7902 3000 7902 ANALYST 3000 7934 1300 7934 CLERK 1300 3.grouping sets子句 作用:按分组列,分别只返回分组列小计记录 实例: select empno,job,avg(sal) from emp group by grouping sets(empno,job); -- EMPNO JOB AVG(SAL) ----- --------- ---------- 7369 800 7499 1600 7521 1250 7566 2975 7654 1250 7698 2850 7782 2450 7788 3000 7839 5000 7844 1500 7876 1100 7900 950 7902 3000 7934 1300 ANALYST 3000 CLERK 1037.5 MANAGER 2758.33333 PRESIDENT 5000 SALESMAN 1400 -- 扩展group by子句的综合应用 rollup子句和cube子句还可以结合其他oracle内置函数一起使用,得到你所想要的结果。 grouping()函数:接受一列,若此列为空,返回1,若此列非空,返回0. 实例1:在rollup中对单列使用grouping() select grouping(job),job,sum(sal) from emp group by rollup(job); -- GROUPING(JOB) JOB SUM(SAL) ------------- --------- ---------- 0 ANALYST 6000 0 CLERK 4150 0 MANAGER 8275 0 PRESIDENT 5000 0 SALESMAN 5600 1 29025 -- 实例2:使用decode()转换grouping()的返回值 select decode(grouping(job),1,'总计',job) divisions, sum(sal) from emp group by rollup(job); DIVISIONS SUM(SAL) --------- ---------- ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 总计 29025 -- 实例3:使用decode()和grouping()转换多列 select decode(grouping(job),1,'总计',job) job, decode(grouping(empno),1,'小计',empno) empno, avg(sal) from emp group by rollup(job,empno); -- JOB EMPNO AVG(SAL) --------- ---------------------------------------- ---------- CLERK 7900 950 CLERK 7369 800 CLERK 7876 1100 CLERK 7934 1300 CLERK 小计 1037.5 ANALYST 7788 3000 ANALYST 7902 3000 ANALYST 小计 3000 MANAGER 7566 2975 MANAGER 7698 2850 MANAGER 7782 2450 MANAGER 小计 2758.33333 SALESMAN 7499 1600 SALESMAN 7521 1250 SALESMAN 7654 1250 SALESMAN 7844 1500 SALESMAN 小计 1400 PRESIDENT 7839 5000 PRESIDENT 小计 5000 总计 小计 2073.21428 -- 实例4:cube与grouping()结合使用 select decode(grouping(job),1,'总计',job) sum, decode(grouping(empno),1,'小计',empno) empno,sum(sal) from emp group by cube(job,empno); -- SUM EMPNO SUM(SAL) --------- ---------------------------------------- ---------- 总计 小计 29025 总计 7900 950 总计 7369 800 总计 7499 1600 总计 7521 1250 总计 7566 2975 总计 7654 1250 总计 7698 2850 总计 7782 2450 总计 7788 3000 总计 7839 5000 总计 7844 1500 总计 7876 1100 总计 7902 3000 总计 7934 1300 CLERK 小计 4150 CLERK 7900 950 CLERK 7369 800 CLERK 7876 1100 CLERK 7934 1300 ANALYST 小计 6000 ANALYST 7788 3000 ANALYST 7902 3000 MANAGER 小计 8275 MANAGER 7566 2975 MANAGER 7698 2850 MANAGER 7782 2450 SALESMAN 小计 5600 SALESMAN 7499 1600 SALESMAN 7521 1250 SALESMAN 7654 1250 SALESMAN 7844 1500 PRESIDENT 小计 5000 PRESIDENT 7839 5000 --