oracle 其实为用户考虑的问题还很多的,有好多的功能我们都没有接触到。
比如说 group by 的扩充,这个功能很强大,其中相关函数包括:sets() , rollup () ,cube() 这三个函数主要是分组。
groping() 这个函数主要是判断 分组列是否为空 , 用在select 映射中。
sets 这个分组函数比较简单,可以根据需求进行自由分组。
sets(col1 , col1 , col1 )
相当于
group by col1 union all
group by col2 union all
group by col3 union all
rollup 这个分组函数, 从左到右依次递增列组合分组。 个人理解有点像数学的一个运算: 100 , 110 , 111 ,每个1表示已分组列。这种分组数为 n 。
1*10 n次方+1*10(n-1) 次方.... 1*10 (n-n) 次方
rollup(col1 , col2 , col3 )
相当于
group by col1 , col2 , col2 union all
group by col1 , col2 union all
group by col1
group by ()
cube 这个分组函数,比较难理解,刚开始时,我始终没有找它的分组规律。最后经过一些文档和自己的多次测试,终于搞清楚了它的分组规律。
其实这个分组函数,有点像数学中的数数(二进制),1 表示已分组的列。这种分组数位 2 n次方减1 。
000
001
010
011
100
101
110
111
cube(col1 , col2 , col3 )
相当于
group by () union all
group by col3 union all
group by col2 union all
group by col2 ,col3 union all
group by col1 union all
group by col1, col3 union all
group by col1, col2 union all
group by col1, col2 , col3 union all
----------------------------------------------------------------------------------------------------------
grouping() 这个函数除了前面说的作用外,其实还有另外一个作用,那就是判断列是否被分组。 它的返回值只有两个,1 和 0 。 当返回 1 时则表明该列没有被分组 ,返回 0 反之。当然这些列都是出现在分组函数中的。其实这个功能在实际的一些报表开发中还是很有用的,可以很好的,直观的区分各个组别。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25380220/viewspace-712874/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25380220/viewspace-712874/