select department_id,job_id,avg(salary),max(salary)
from hr.employees
group by department_id,job_id
union all
select department_id,null,avg(salary),max(salary)
from hr.employees
group by department_id
union all
select null,null,avg(salary),max(salary)
from hr.employees;
这样变的更加复杂了,所有多亏了那个rollup 函数。rollup 函数的求值过程是这样的。
对于: group by rollup (department_id,job_id)
1、先按照正常的group by 语句进行聚集一次。在这里实质上就是
select department_id,job_id,avg(salary),max(salary)
from hr.employees
group by department_id,job_id;
2、更加rollup 中参照的列表,进一步进行聚集。在这里实质上就是
select department_id,null,avg(salary),max(salary)
from hr.employees
group by department_id;
3、进行一个总的聚集。
select null,null,avg(salary),max(salary)
from hr.employee;
所以如果rollup 中参照的列的个数是n,那么将会进行 n+1 级聚集。
结果是一样的,不过个人认为使用rollup 或者把上面的3 条select 语句捆绑为一条语句,查询输出的结果可读性就没有那么好了。比如department_id,job_id 都是空的那一列对应的是hr.employees
表中总的平均工资,最高工资。