ybaidukuai 发表于 2018-9-22 07:37:53

Oracle group by 用法实例详解

  使用grouping函数有时候感觉不是那么灵活的,他只能接收一个字段,而grouping_id()函数则可以接收多个字段,GROUPING_ID()函数可以接受一列或多列,返回按GROUPING位向量进行计算的十进制值。下面我们通过一个例子来研究grouping_id函数是如何按照grouping函数的位向量进行计算的。
  SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b);
  Result:
CACBCAANDBABSUM(N)000a1b130011a1 3011330  位向量计算方法:如上例,
  第一行,CA=0,CB=0,那么位向量就是“00”,换算成十进制是0
  第二行,CA=0,CB=1,那么位向量就是‘01’,换算成十进制是1
  第三行,CA=1,CB=1,那么位向量就是‘11’,换算成十进制是3
  请注意上例中grouping_id的计算值跟括号内的字段顺序有关,上例中书写顺序是grouping_id(a,b),a字段在前面,如果换下顺序grouping_id(b,a),计算结果是不一样的,看下例
  SQL> select grouping(a) ca,grouping(b) cb,grouping_id(b,a) caandb, a,b,sum(n) from testgroup group by rollup(a,b);
  Result:
CACBCAANDBABSUM(N)000a1b130012a1 3011330  看看第二行红色字体,grouping_id中的字段顺序发生了变化,位向量值也不一样了
  (4-1) grouping_id()函数的用途
  上面讲了grouping_id的用法,但在日常工作中,我们如何应用该函数呢?其实只要了解了他的原理及用法,要怎么用,就看我们是否可以灵活使用了,下面介绍一种常见的用法:
  假如我们要对某testgroup进行分组统计,并且过滤掉不包括小计或总计的行,这时grouping_id就有用武之地了,我们可以利用grouping_id的值结合having子句,通过判断grouping_id是否大于0来过滤掉不需要的行。
  SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b) having grouping_id(a,b)>0;
  Result:
CACBCAANDBABSUM(N)011a1 3011330
页: [1]
查看完整版本: Oracle group by 用法实例详解