原创

Oracle group by 分组

group by cube(a,b,......) cube参数中的所有可能的元素组合。eg:a b, null b,a null,null null。
grouping()函数用来辨别数据中原有的空值(返回0)和cube扩展所插入的空值(返回1),被用来作为grouping()函数参数的表达式必须与出现在group by子句中(也包含cube()参数)的表达式相匹配。可结合decode()函数替换为其他值。可跟在having后进一步限制。
grouping_id()函数返回一个基于位矢量的数值:计算一个表达式,确定其参数中的哪一行用来生成超聚合行,然后创建一个位矢量,并将该值作为整型值返回。eg:grouping_id(a,b),a被用来生成超聚合行,b没有的话,二进制1||0为2,a没有而b使用的话,0||1为1,a和b都没有,0||0为0,a和b皆使用,1||1为3。

rollup()函数、cube()函数

--通常与group by 子句一起使用,根据维度在分组后进行聚合操作
--应用场景:为每个分组返回一个小计,同时为所有分组返回总计
select ename,deptno,sum(sal) from emp group by rollup(deptno,ename);
--rollup和cube独立考虑每一列再决定其必须计算小计,对rollup()而言,通过列表来确定分组,
--而cube函数则对每种可能的列组合分组

rollup()辅助函数:往往是为了过滤掉一部分统计数据,而达到美化统计结果的作用。

--grouping():必须接受一列且只能接受一列做为其参数。参数列值为空返回1,参数列值非空返回0。(即如果参数的列的值在rollup中,则返回1;否则返回0)
select ename,deptno,sum(sal),grouping(ename),grouping(deptno) from emp group by rollup(deptno,ename);

--grouping_id():必须接受一列或多列做为其参数。返回值为按参数排列顺序,依次对各个参数使用grouping()函数,
--并将结果值依次串成一串二进制数然后再转化为十进制所得到的值
select ename,deptno,sum(sal),grouping_id(deptno,ename) from emp group by rollup(deptno,ename);
例如:grouping(a) = 0 ; grouping(b) = 1;
则:grouping_id(a,b) = (01)2 = 1;
grouping_id(b,a) = (10)2 =2;

--group_id()函数:调用时不需要且不能传入任何参数。返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。
--重复次数从0开始,例如某个分组第一次出现则返回值为0,第二次出现时返回值为1,……,第n次出现返回值为n-1。可用来去重

grouping sets()函数:指定感兴趣的分组,减少计算整个维度的消耗
select deptno,ename,sum(sal)from emp group by grouping sets (deptno,ename);

group by局限性:
LOB列,嵌套表或数组不能用作group by表达式的一部分;
不允许使用标量子查询表达式;
如果group by子句引用任何对象类型的列则查询不能并行化。

正文到此结束
该篇文章的评论功能已被站长关闭