首页 / 数据库 / MySQL / Oracle 高级分组group by cube拓展
Oracle的cube拓展功能会将cube()里指定的每一列按照顺序替换成null值,并返回指定列的所有组合。
oracle的cube分组拓展主要用于替换需要通过union all和goup by 组合来实现业务功能的场景。通过该函数可以节省代码量,且使代码更加简洁。实验过程如下:
首先看一下A表的内容:
HR@ORA11GR2 > select * from a;
A A2 A3
---------- ---------- ----------
1 4 5
2 4 6
3 4 7
4 5 9
5 5 10
6 5 11
7 5 12
8 5 13
8 rows selected. 若要通过union all 来实现数据组合功能:HR@ORA11GR2 > with temp as (
2 select a, a2 from a
3 union all
4 select a , null a2 from a
5 union all
6 select null a , a2 from a
7 union all
8 select null a , null a2 from a
9 )
10 select * from temp group by a, a2 order by a2 desc;
A A2
---------- ----------
1
2
3
4
5
6
7
8
4 5
5 5
A A2
---------- ----------
6 5
7 5
8 5
5
1 4
2 4
3 4
4
19 rows selected. 使用cube分组拓展结果:
HR@ORA11GR2 > select a, a2 from a group by cube(a, a2) order by a2 desc;
A A2
---------- ----------
1
2
3
4
5
6
7
8
4 5
5 5
A A2
---------- ----------
6 5
7 5
8 5
5
1 4
2 4
3 4
4
19 rows selected.
从上面的输出中,我们会发现cube会将许多的null值,如果cube()里指定的列本身就具有null值,又需要如何区分呢?解决方法为通过grouping()函数来排除null值,例如grouping(a)来检测A表中a列是否有一行null值是由cube产生的,如果有,则返回1,其他所有情况,则返回0.接着再结合decode()函数或case表达式,来将cube()产生的null值转化成通俗易懂的字符串。
实验如下:
HR@ORA11GR2 > select decode(grouping(a),1,"cube_value",a) a , decode(grouping(a2), 1, "cube_value",a2) a2 from a group by cube(a, a2) order by a2 desc;
A A2---------------------------------------- ----------------------------------------cube_value cube_value4 cube_value8 cube_value7 cube_value6 cube_value5 cube_value3 cube_value2 cube_value1 cube_valuecube_value 56 5
A A2---------------------------------------- ----------------------------------------8 57 54 55 51 4cube_value 43 42 419 rows selected.更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址