group by rollup 后怎样区分排序
2个回答
展开全部
ROLLUP:
GROUP BY A, B会对A和B出现的每种可能性进行分组。而GROUP BY ROLLUP(A, B)会对A和B出现的每种可能性分组,A的每种可能性分组,最后计算所有的情况。
例如:
rollup(a,b) 包括:(a,b)、(a)、()
rollup(a,b,c) 包括:(a,b,c)、(a,b)、(a)、()
CUBE:
和ROLLUP类似,GROUP BY CUBE(A, B)会对A和B出现的每种可能性分组,A的每种可能性分组,B的每种可能性分组,最后计算所有的情况。
Oracle为了解决引入ROLLUP和CUBE后,汇总和NULL值无法区分的情况,提供了GROUPING、GROUPING_ID和GROUP_ID三个函数。
例如:
cube(a,b) 包括:(a,b)、(a)、(b)、()
cube(a,b,c) 包括:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()
========================================================
下面以emp表句例子说明:
SQL>break on deptno skip 1 --为了效果明显,我们加上break
SQL> select deptno,ename,sum(sal)
2 from emp
3 group by rollup(deptno,ename);
DEPTNO ENAME SUM(SAL)
---------- ---------- ----------
10 KING 5000
CLARK 2450
MILLER 1300
8750
20 FORD 3000
ADAMS 1100
JONES 2975
SCOTT 3000
SMITH 800
10875
30 WARD 1250
ALLEN 1600
BLAKE 2850
JAMES 950
MARTIN 1250
TURNER 1500
9400
29025
下面对上述显示加上排序功能
SQL> select t1.deptno,nvl(t1.ename,'小计') as ename,t1.sum_sal
2 from (select deptno,ename,sum(sal) as sum_sal from emp group by rollup(deptno,ename)) t1,
3 (select deptno,sum(sal) as sum_sal from emp group by (deptno)) t2
4 where t1.deptno=t2.deptno
5 order by t2.sum_sal desc,t1.deptno,t1.ename
6 /
DEPTNO ENAME SUM_SAL
---------- ---------- ----------
20 ADAMS 1100
FORD 3000
JONES 2975
SCOTT 3000
SMITH 800
小计 10875
30 ALLEN 1600
BLAKE 2850
JAMES 950
MARTIN 1250
TURNER 1500
WARD 1250
小计 9400
10 CLARK 2450
KING 5000
MILLER 1300
小计 8750
已选择17行。
这里在order by 中加一个 t1.deptno 是避免万一两个deptno的sum(sal)一样
附:清除break输出样式:clear break
同样compute sum of sal on ename的清除:clear compute
GROUP BY A, B会对A和B出现的每种可能性进行分组。而GROUP BY ROLLUP(A, B)会对A和B出现的每种可能性分组,A的每种可能性分组,最后计算所有的情况。
例如:
rollup(a,b) 包括:(a,b)、(a)、()
rollup(a,b,c) 包括:(a,b,c)、(a,b)、(a)、()
CUBE:
和ROLLUP类似,GROUP BY CUBE(A, B)会对A和B出现的每种可能性分组,A的每种可能性分组,B的每种可能性分组,最后计算所有的情况。
Oracle为了解决引入ROLLUP和CUBE后,汇总和NULL值无法区分的情况,提供了GROUPING、GROUPING_ID和GROUP_ID三个函数。
例如:
cube(a,b) 包括:(a,b)、(a)、(b)、()
cube(a,b,c) 包括:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()
========================================================
下面以emp表句例子说明:
SQL>break on deptno skip 1 --为了效果明显,我们加上break
SQL> select deptno,ename,sum(sal)
2 from emp
3 group by rollup(deptno,ename);
DEPTNO ENAME SUM(SAL)
---------- ---------- ----------
10 KING 5000
CLARK 2450
MILLER 1300
8750
20 FORD 3000
ADAMS 1100
JONES 2975
SCOTT 3000
SMITH 800
10875
30 WARD 1250
ALLEN 1600
BLAKE 2850
JAMES 950
MARTIN 1250
TURNER 1500
9400
29025
下面对上述显示加上排序功能
SQL> select t1.deptno,nvl(t1.ename,'小计') as ename,t1.sum_sal
2 from (select deptno,ename,sum(sal) as sum_sal from emp group by rollup(deptno,ename)) t1,
3 (select deptno,sum(sal) as sum_sal from emp group by (deptno)) t2
4 where t1.deptno=t2.deptno
5 order by t2.sum_sal desc,t1.deptno,t1.ename
6 /
DEPTNO ENAME SUM_SAL
---------- ---------- ----------
20 ADAMS 1100
FORD 3000
JONES 2975
SCOTT 3000
SMITH 800
小计 10875
30 ALLEN 1600
BLAKE 2850
JAMES 950
MARTIN 1250
TURNER 1500
WARD 1250
小计 9400
10 CLARK 2450
KING 5000
MILLER 1300
小计 8750
已选择17行。
这里在order by 中加一个 t1.deptno 是避免万一两个deptno的sum(sal)一样
附:清除break输出样式:clear break
同样compute sum of sal on ename的清除:clear compute
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询