rollup(a[,b,...])的逻辑

来源:2-11 [Oracle] SQLPLUS报表功能

180416

2019-01-03 17:32

先记一下,看完课程再想。

代码如下:

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

写回答 关注

1回答

  • 巳水流年
    2019-01-08 15:14:22

    abcdefg

Oracle高级查询

数据库开发中应用广泛的高级查询,本教程通过大量的案例详细讲解

62862 学习 · 144 问题

查看课程

相似问题