先记一下,看完课程再想。
代码如下:
SQL> select deptno,avg(sal) from emp group by rollup(deptno);
DEPTNO AVG(SAL)
------ ----------
10 2916.66666
20 2175
30 1566.66666
2073.21428
SQL> select deptno,empno,avg(sal) from emp group by rollup(deptno,empno);
DEPTNO EMPNO AVG(SAL)
------ ----- ----------
10 7782 2450
10 7839 5000
10 7934 1300
10 2916.66666
20 7369 800
20 7566 2975
20 7788 3000
20 7876 1100
20 7902 3000
20 2175
30 7900 950
.........
2073.21428
18 rows selected
SQL> select deptno,empno,job,avg(sal) from emp group by rollup(deptno,empno,job);
DEPTNO EMPNO JOB AVG(SAL)
------ ----- --------- ----------
10 7782 MANAGER 2450
10 7782 2450
10 7839 PRESIDENT 5000
10 7839 5000
10 7934 CLERK 1300
10 7934 1300
10 2916.66666
20 7369 CLERK 800
.........
2073.21428
32 rows selected
按上面的规则:
用第三条语句的口语化说明:
select deptno,empno,job,avg(sal) from emp group by rollup(deptno,empno,job);
它的排序规则是用 第一个字段deptno 排序的
查出第一条数据之后,【如果select_list有分组函数,分组函数这一列就显示对应的数据的值(不是分组函数的值),】如果相同的deptno和empno有不同于第一条的job,有就继续走下去。
走完就返回到deptno,empno这一层 (不懂,这行的值怎么算的)
接着看有没有不同于上面查询出来的job,有的话重复上面步骤,没有的走到deptno,(这一行做分组函数这一列显示分组函数的值,为什么,是因为它是rollup函数或者select_list的第一个元素?,感觉要写一个表看看)
接着就用新的empno继续走,用上面的规则继续走,直到所有分组都走完,最后显示sum(sal);
abcdefg