ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 聚集函数之rollup

聚集函数之rollup

原创 Linux操作系统 作者:pingley 时间:2012-04-01 12:52:42 0 删除 编辑
rollup 与  cube 这两个聚集函数相对于其他的聚集函数来说比较复杂点。如果有适用的场景适用rollup 与cube 可以事半功倍的效果。先来学习rollup。
rollup
在select 语句中使用rollup 会计算多级(multiple levels) 的分类汇总,通过指定的一组维度。rollup 只是对group by 子句进行简单的扩展,所以语法很容易掌握。效率也很高,只会带来很小的查询开销。
rollup 语法格式:
select ... group by rollup(grouping_column_reference_list)
示例说明:
我想知道:
1、每个部门,每个工作岗位的平均工资,最高工资。
2、每个部门的平均工资,最高工资。
3、整个公司的平均工作,最高工资。
并且只使用一条select 语句实现。实现如下
我通过使用 group rollup 实现了上述的查询,如果把上面的需求转换成多个select 语句在通过union all的话对应为。
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
表中总的平均工资,最高工资。

s1.JPG

s2.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-720149/,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORA-01790 错误处理
下一篇: rowid 伪列
请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    714997