/*grouping_id函数:用来过滤分组级别和排序结果的,因为grouping过滤比较麻烦
该函数接受rollup,CUBE,GROUPING sets中的列,按从左到右的顺序计算,如果此列是分组列则为0,如果是对此列的小计或合计则为1,
然后根基二进制序列转成十进制数*/
----等价于
------------------
/*可以利用grouping_id进行排序,且排序具有灵活性,主要依赖于grouping_id里的字段顺序*/
-----------------
------------------
该函数接受rollup,CUBE,GROUPING sets中的列,按从左到右的顺序计算,如果此列是分组列则为0,如果是对此列的小计或合计则为1,
然后根基二进制序列转成十进制数*/
SELECT a.dname,b.mgr,b.job,SUM(sal) sum_sal--,grouping_id(a.dname,b.mgr,b.job)
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP BY ROLLUP(a.dname,b.mgr,b.job)
HAVING grouping_id(a.dname,b.mgr,b.job) IN(0,7);
----等价于
SELECT a.dname,b.mgr,b.job,SUM(sal) sum_sal--,GROUPING(a.dname),GROUPING(b.mgr),GROUPING(b.job)
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP BY ROLLUP(a.dname,b.mgr,b.job)
HAVING GROUPING(a.dname) = 1
OR GROUPING(b.job) = 0;
------------------
/*可以利用grouping_id进行排序,且排序具有灵活性,主要依赖于grouping_id里的字段顺序*/
SELECT DECODE(GROUPING(a.dname),1,'全部部门',a.dname) dname,
DECODE(GROUPING(b.mgr),1,'全部老板',nvl(to_char(b.mgr),'总老板')) mgr,
SUM(sal) sum_sal--,grouping_id(a.dname,b.mgr)
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP BY ROLLUP(a.dname,b.mgr)
ORDER BY grouping_id(a.dname,b.mgr);
-----------------
SELECT a.dname,b.mgr,b.job,SUM(sal) sum_sal--,grouping_id(a.dname,b.mgr,b.job)
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP BY CUBE(a.dname,b.mgr,b.job)
ORDER BY grouping_id(a.dname,b.mgr,b.job);
------------------
SELECT a.dname,b.mgr,b.job,SUM(sal) sum_sal--,grouping_id(a.dname,b.job,b.mgr)
FROM dept a,emp b
WHERE a.deptno = b.deptno
GROUP BY CUBE(a.dname,b.mgr,b.job)
ORDER BY grouping_id(a.dname,b.job,b.mgr);