首页 / 数据库 / MySQL / Oracle增强型分组函数
ROLLUP()函数是对于GROUP BY 分组统计的功能扩展,可以实现分组统计求和的效果。下面我们开始准备我们的试验的环境--创建新表employee_salary,存储数据来自用户hr.employeesSQL>CREATE TABLE employee_salary ASSELECT E.FIRST_NAME,E.JOB_ID,E.MANAGER_ID,E.SALARY FROM HR.EMPLOYEES E WHERE E.JOB_ID="IT_PROG";
--查看新创建的表SQL>SELECT * FROM employee_salary;--显示效果如下FIRST_NAME JOB_ID MANAGER_ID SALARY-------------------- ---------- --------------------------------Alexander IT_PROG 102 9000.00Bruce IT_PROG 103 6000.00David IT_PROG 103 4800.00Valli IT_PROG 103 4800.00Diana IT_PROG 103 4200.00 --首先按照JOB_ID进行分组,查看salary和SQL>SELECT sa.job_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.job_id;--显示效果如下JOB_ID SUM(SA.SALARY)---------- -----------------------IT_PROG 28800--按照MANAGER_ID进行分组,查看salary和SELECT sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.manager_id;--显示效果如下MANAGER_ID SUM(SA.SALARY)---------- ---------------------------- 102 9000 103 19800--我们使用ROLLUP函数看看是什么效果SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY ROLLUP(sa.job_id,sa.manager_id);--显示效果如下JOB_ID MANAGER_ID SUM(SA.SALARY)---------- ---------- --------------------------------IT_PROG 102 9000IT_PROG 103 19800IT_PROG 28800 28800说明:ROLLUP解析过程,以ROLLUP(a,b)为例ROLLUP(a,b)== GROUP(a,b) UNION ALL GROUP(a) UNIONALL GROUP()即:解析顺序是从右至左,显示按照a,b分组,接下来是按照a分组,最后是对全表分组;上面ROLLUP (sa.job_id,sa.manager_id)等同下面UNION ALL的集合操作SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary saGROUP BY sa.job_id,sa.manager_idUNION ALLSELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary saGROUP BY sa.job_idUNION ALLSELECT NULL,NULL,SUM(sa.salary) FROM employee_salary sa GROUP BY()ORDER BY 1,2;--显示效果如下JOB_ID MANAGER_ID SUM(SA.SALARY)---------- ---------- --------------------------------IT_PROG 102 9000IT_PROG 103 19800IT_PROG 28800 28800说明:虽然最后展示的效果是相同的,但是ROLLUP()函数的执行效率要比UNION ALL的效率要高、要快。ROLLUP(A,B,C)是在执行组合操作,无顺序,组合公式是(n+1),当n=3时,组合结果就是有4个。ROLLUP()中的参数位置不同,得出的结果可能不一样!在理解ROLLUP的基础上再来理解CUBE()就比较容易,ROLLUP()在执行组合操作,CUBE()就是在执行排序动作,从左至右,排序公式是2N次方。CUBE(A,B,C)==GROUP BY (A,B,C) UNION ALL GROUP BY (A,B) UNION ALL GROUP BY (A,C) UNION ALL GROUPBY (A) UNION ALL GROUP BY (B) UNION ALL GROUP BY (C) UNION ALL GROUP BY ()例如:执行下列语句SQL> SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY CUBE(sa.job_id,sa.manager_id);--显示效果如下 JOB_ID MANAGER_ID SUM(SA.SALARY)---------- ---------- ----------------------------- 28800 102 9000 103 19800IT_PROG 28800IT_PROG 102 9000IT_PROG 103 19800 6 rows selected上面的语句等同执行下列语句SQL>SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY (sa.job_id,sa.manager_id)UNION ALLSELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary saGROUP BY (sa.job_id)UNION ALLSELECT NULL,sa.manager_id,SUM(sa.salary) FROM employee_salary saGROUP BY (sa.manager_id)UNION ALLSELECT NULL,NULL,SUM(sa.salary) FROM employee_salary saGROUPBY ();关于GROUPINGGROUPING(A)用于判断对于分组后的列是否是空值NULL,返回值有0和1两个值,1表示,该列为空——NULL,这个NULL值是因为分组时产生,否则则为0;Oracle 单实例 从32位 迁移到 64位 方法 http://www.linuxidc.com/Linux/2012-03/55759.htm在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htmDebian 下 安装 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址