GROUP函数-GROUP_ID,GROUPING,GROUPING_ID

GROUP函数-GROUP_ID,GROUPING,GROUPING_ID,第1张

概述GROUP_ID首先我们看看官方的解释:大意是GROUP_ID用于区分相同分组标准的分组统计结果。解释起来比较抽象,下面我们来看看具体的案例。例1:单一分组SQL> select group_i

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1151827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存