rollup(),cube(),grouping sets()
上面这几个函数,是对group by分组功能做的功能扩展。
a.rollup()
功能:在原结果基础上追加一行总合计记录
rollup(字段1,字段2)会追加按字段1进行的合计记录,
最后再追加一个总合计记录
select deptno,count(*)
from emp
group by rollup(deptno);
select deptno,job,count(*)
from emp
group by rollup(deptno,job)
order by deptno;
----等价于下面写法-----
select deptno,job,count(*)
from emp
group by deptno,job
union
select deptno,null,count(*)
from emp
group by deptno
union
select null,null,count(*)
from emp
order by deptno;
结论:group by rollup(字段1,字段2,字段3)
--查询按字段1,字段2,字段3分组统计结果
--追加按字段1和字段2的合计
--追加按字段1的合计
--追加总合计记录
b.cube()
select deptno,count(*)
from emp
group by cube(deptno)
order by deptno;
cube(字段1):作用于rollup(字段1)相同。
追加一行总合计记录。
select deptno,job,count(*)
from emp
group by cube(deptno,job)
order by deptno;
--查询group by deptno,job分组统计结果
--查询group by deptno分组统计结果
--查询group by job分组统计结果
--查询没有group by统计结果
结论:group by cube(字段1,字段2,字段3)
--查询group by 字段1,字段2,字段3统计结果
--查询group by 字段1,字段2统计结果
--查询group by 字段1统计结果
--查询group by 字段2统计结果
--查询group by 字段3统计结果
--查询group by 字段2,字段3统计结果
--查询group by 字段1,字段3统计结果
--查询没有group by统计结果
c.grouping sets()
select deptno,count(*)
from emp
group by grouping sets(deptno)
order by deptno;
--上面和没加grouping sets()效果一样
select deptno,job,count(*)
from emp
group by grouping sets(deptno,job)
order by deptno;
--只返回cube规则追加的分组统计结果
--不包含没有group by和group by deptno,job的统计