? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? 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_value
4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cube_value
cube_value? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
?
A? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A2
---------------------------------------- ----------------------------------------
8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5
1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4
cube_value? ? ? ? ? ? ? ? ? ? ? ? 4
3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4
2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4
19 rows selected.