Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping和grouping_id()可以美化效果。
给一个完整的SQL,我相信根据下面的SQL应该可以学习了。
select decode(grouping_id(t2.deptno,ROWNUM),3,'总计',1,'小计',t2.deptno) deptno,
decode(GROUPING(ROWNUM), 1, NULL, MAX(t2.dname)) dname,
decode(GROUPING(ROWNUM), 1, NULL, MAX(EMPNO)) EMPNO,
decode(GROUPING(ROWNUM), 1, NULL, MAX(ENAME)) ENAME,
decode(GROUPING(ROWNUM), 1, NULL, MAX(job)) job,
SUM(t1.sal)
FROM scott.emp t1, scott.dept t2
WHERE t1.deptno = t2.deptno
GROUP BY ROLLUP(t2.deptno, ROWNUM)