GROUP_ID
首先我们看看官方的解释:
大意是GROUP_ID用于区分相同分组标准的分组统计结果。
解释起来比较抽象,下面我们来看看具体的案例。
例1:单一分组
sql> select group_ID(),deptno,sum(sal) from emp group by rollup(deptno);GROUP_ID() DEPTNO SUM(SAL)---------- ---------- ---------- 0 10 8750 20 10875 30 9400 0 29025
rollup(deptno)只是一个唯一的分组,所以产生的group_ID()为0,代表这是同一个分组的结果。
下面我们来看看重复分组的情况
例2:重复分组
sql rollup(deptno,deptno);GROUP_ID() DEPTNO -------- ---------- ---------- 1 290257 rows selected.
group_ID()为1代表这些是重复的分组。
注意:可通过having group_ID() <1来剔除重复的分组。
老实说,我也看不出GROUP_ID在实际工作中的应用场景,姑且先记着。
GROUPing
其语法为:GROUPing(expr)
下面我们来看看官方的解释:
即GROUPing函数用于区分分组后的普通行和聚合行。如果是聚合行,则返回1,反之,则是0。
下面我们来看看具体的案例:
sqlselect grouPing(deptno),1)">grouPing(job),job,job);GROUPing(DEPTNO) GROUPing(JOB) DEPTNO JOB -------------- ------------- ---------- --------- ---------- 0 0 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 1 10 8750 20 CLERK 1900 20 ANALYST 6000 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 30 9400 1 1 13 rows selected.
首先我们看GROUPing(DEPTNO)这一列的结果,不难看出,凡是基于DEPTNO的汇总,GROUPing的结果均为0,因为最后一行是总的汇总,所以GROUPing的值为1.
基于这个逻辑,可以看出GROUPing(JOB)的值也是吻合的。
GROUPing_ID
GROUPing_ID是GROUPing的增强版,与GROUPing只能带一个表达式不同,它能带多个表达式。
语法如下:
GROUPing_ID(expr1,expr2,expr3,….)
下面我们来看看官方的解释:
GROUPing_ID在功能上相当于将多个GROUPing函数的结果串接成二进制数,返回的是这个二进制数对应的十进制数。
下面我们来看看具体的案例:
sqlgrouPing(deptno)g_d,1)">grouPing(job)g_j,grouPing_ID(deptno)gi_d,grouPing_ID(job)gi_j,grouPing_ID(deptno,job)gi_dj,grouPing_ID(job,deptno)gi_jd,1)"> cube(deptno,job); G_D G_J GI_D GI_J GI_DJ GI_JD DEPTNO JOB -------- ---------- ---------- ---------- ---------- ---------- ---------- --------- ---------- 1 3 3 29025 0 2 1 CLERK 4150 1 ANALYST 6000 1 MANAGER 8275 1 SALESMAN 5600 1 PRESIDENT 5000 2 10 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 20 20 CLERK 1900 20 ANALYST 20 MANAGER 2975 30 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 560018 rows selected.
大家看到这个案例估计都有点晕。。。
之所以这样提供,是为了呈现一个直观的结果进行对比。
解读这个结果,需要注意以下两点:
1> 若本行是某expr的汇总,那么该expr对应的二进制数位置为0否则置为1。
2> GROUPing_ID(expr1,….)的值其实是对应GROUPing(expr1),GROUPing(expr2),GROUPing(expr3)...值的串接。
首先看第一列,第三列,虽然一个是grouPing(deptno),一个是grouPing_ID(deptno),因为只有一个表达式,所以两者的结果是一样的。第二列,第四列同样如此。
第五列的结果是第一列和第二列的数值的串接,然后返回的十进制数,以第二行为例,GI_DJ=2其实是二进制10转化为十进制后的数,其中1为G_D的值,0为G_J的值。
而GI_JD=1则是二进制01转化为十进制后的数,其中0为G_J的值,1为G_D的值。注意,串接的顺序为GROUPing_ID中表达式的顺序。
说了这么多,下面我们来看一个利用GROUPing_ID实现行列转换的案例。
with t as ( select grouPing_ID(deptno,1)">count(*)cnt ( select decode(gi_dj,0,1); Font-weight: bold">1,1); Font-weight: bold">99) deptno,decode(gi_dj,cnt,1); Font-weight: bold">3,cnt)sub_total,decode(job,'CLERK',cnt) c1,1)">ANALYSTMANAGER'SALESMANPRESIDENTfrom t)select deptno,1)">max(sub_total) sub_total,1)">max(c1)clerk,1)">max(c2)analyst,1)">max(c3)manager,1)">max(c4)salesman,1)">(c5)presIDent from t1 by deptno order by deptno;
最后生成的结果如下:
DEPTNO SUB_TOTAL CLERK ANALYST MANAGER SALESMAN PRESIDENT-------- ---------- ---------- --------- ---------- ---------- ---------- 10 3 1 1 1 20 5 30 6 1 4 99 14 4 3 1
其中,99代表合计,sub_total代表小计。这种统计类的需求在实际生产中还是应用蛮广的。
当然,该结果也可利用PIVOT函数实现,具体语句如下:
as(*)cnt as (99)deptno,1); Font-weight: bold">2,1); Font-weight: bold">9)job,cnt select * from (from t1)pivot(sum(cnt)for job in (9')) by deptno;
参考资料:
1> http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions070.htm#SQLRF00646
2> http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions071.htm#SQLRF00647
3> http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions072.htm#SQLRF00648
总结
以上是内存溢出为你收集整理的GROUP函数-GROUP_ID,GROUPING,GROUPING_ID全部内容,希望文章能够帮你解决GROUP函数-GROUP_ID,GROUPING,GROUPING_ID所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)