`

ORACLE GROUPING_ID函数

 
阅读更多

可以使用GROUPING_ID函数借助HAVING子句对记录进行过滤,将不包含小计或者总计的记录除去。GROUPING_ID()函数可以接受一列或多列,返回GROUPING位向量的十进制值。GROUPING位向量的计算方法是将按照顺序对每一列调用GROUPING函数的结果组合起来。

 

关于GROUPING函数的使用方法可以参见我前面写的一篇文章

http://blog.csdn.net/wh62592855/archive/2009/11/16/4818072.aspx

 

1、GROUPING_ID用法实例

SQL> select
  2  division_id,job_id,
  3  grouping(division_id) as div_grp,
  4  grouping(job_id) as job_grp,
  5  grouping_id(division_id,job_id) as grp_id,
  6  sum(salary)
  7  from employees2
  8  group by cube(division_id,job_id)
  9  order by division_id,job_id;

DIV JOB    DIV_GRP    JOB_GRP     GRP_ID SUM(SALARY)
--- --- ---------- ---------- ---------- -----------
BUS MGR          0          0          0      530000
BUS PRE          0          0          0      800000
BUS WOR          0          0          0      280000
BUS              0          1          1     1610000
OPE ENG          0          0          0      245000
OPE MGR          0          0          0      805000
OPE WOR          0          0          0      270000
OPE              0          1          1     1320000
SAL MGR          0          0          0     4446000
SAL WOR          0          0          0      490000
SAL              0          1          1     4936000

DIV JOB    DIV_GRP    JOB_GRP     GRP_ID SUM(SALARY)
--- --- ---------- ---------- ---------- -----------
SUP MGR          0          0          0      465000
SUP TEC          0          0          0      115000
SUP WOR          0          0          0      435000
SUP              0          1          1     1015000
    ENG          1          0          2      245000
    MGR          1          0          2     6246000
    PRE          1          0          2      800000
    TEC          1          0          2      115000
    WOR          1          0          2     1475000
                 1          1          3     8881000

21 rows selected.

 

2、GOURPING位向量计算

如上例所示

division_id          job_id           位向量      GROUPING_ID()返回值

非空                     非空              00             0

非空                     空                 01             1

空                        非空              10             2

空                        空                 11             3

 

3、GROUPING_ID()的用武之地

GROUPING_ID()的一个用武之地在于使用HAVING子句过滤记录。HAVING子句可以将不包含小计或总计的记录除去,这只要通过简单的检查GROUPING_ID()的返回值,看其是否大于零就可以实现。

SQL> select
  2  division_id,job_id,
  3  grouping_id(division_id,job_id) as grp_id,
  4  sum(salary)
  5  from employees2
  6  group by cube(division_id,job_id)
  7  having grouping_id(division_id,job_id) > 0
  8  order by division_id,job_id;

DIV JOB     GRP_ID SUM(SALARY)
--- --- ---------- -----------
BUS              1     1610000
OPE              1     1320000
SAL              1     4936000
SUP              1     1015000
    ENG          2      245000
    MGR          2     6246000
    PRE          2      800000
    TEC          2      115000
    WOR          2     1475000
                 3     8881000

10 rows selected.

 

4、在GROUP BY子句中多次使用一个列

在GROUP BY子句中可以多次使用某个列,这样可以实现对数据的重新组织,或是按照不同的数据分组进行统计。例如,下面这个查询中包含一个GROUP BY子句,其中使用了两次division_id列,第一次是对division_id进行分组,第二次是在ROLLUP中使用。

SQL> select division_id,job_id,sum(salary)
  2  from employees2
  3  group by division_id,rollup(division_id,job_id);

DIV JOB SUM(SALARY)
--- --- -----------
BUS MGR      530000
BUS PRE      800000
BUS WOR      280000
OPE ENG      245000
OPE MGR      805000
OPE WOR      270000
SAL MGR     4446000
SAL WOR      490000
SUP MGR      465000
SUP TEC      115000
SUP WOR      435000

DIV JOB SUM(SALARY)
--- --- -----------
BUS         1610000
OPE         1320000
SAL         4936000
SUP         1015000
BUS         1610000
OPE         1320000
SAL         4936000
SUP         1015000

19 rows selected.

 

但是需要注意,最后四行记录和前面四行记录是重复的。这种重复现象可以通过使用GROUP_ID()来消除。

 

5、使用GROUP_ID函数

GROUP_ID函数可用于消除GROUP BY子句返回的重复记录。GROUP_ID()不接受任何参数。如果某个特定的分组重复出现n次,那么GROUP_ID()返回从0到n-1之间的一个整数。下面我们重写上面那个例子

SQL> select division_id,job_id,group_id(),sum(salary)
  2  from employees2
  3  group by division_id,rollup(division_id,job_id);

DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS MGR          0      530000
BUS PRE          0      800000
BUS WOR          0      280000
OPE ENG          0      245000
OPE MGR          0      805000
OPE WOR          0      270000
SAL MGR          0     4446000
SAL WOR          0      490000
SUP MGR          0      465000
SUP TEC          0      115000
SUP WOR          0      435000

DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS              0     1610000
OPE              0     1320000
SAL              0     4936000
SUP              0     1015000
BUS              1     1610000
OPE              1     1320000
SAL              1     4936000
SUP              1     1015000

19 rows selected.

可以通过HAVING子句来消除重复记录,只返回GROUP_ID()等于0的记录。

SQL> select division_id,job_id,group_id(),sum(salary)
  2  from employees2
  3  group by division_id,rollup(division_id,job_id)
  4  having group_id()=0;

DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS MGR          0      530000
BUS PRE          0      800000
BUS WOR          0      280000
OPE ENG          0      245000
OPE MGR          0      805000
OPE WOR          0      270000
SAL MGR          0     4446000
SAL WOR          0      490000
SUP MGR          0      465000
SUP TEC          0      115000
SUP WOR          0      435000

DIV JOB GROUP_ID() SUM(SALARY)
--- --- ---------- -----------
BUS              0     1610000
OPE              0     1320000
SAL              0     4936000
SUP              0     1015000

15 rows selected.

分享到:
评论

相关推荐

    grouping or grouping_id in ORACLE

    在Oracle数据库中,`GROUPING` 和 `GROUPING_ID` 是两种非常有用的函数,它们能够帮助用户更好地理解和组织聚合查询的结果。这两种函数主要用于处理复杂的分组情况,尤其是在使用`ROLLUP` 或 `CUBE` 时更为显著。...

    《Pro Oracle SQL》Chapter7 -- 7.8Extending Reports With GROUPING_ID()

    《Pro Oracle SQL》一书的第七章第7.8节主要探讨了如何通过GROUPING_ID()函数来扩展Oracle SQL报告的功能。GROUPING_ID()在数据分析和报表生成中扮演着重要角色,尤其在处理分组数据时,能提供更详细的分组信息。本...

    Oracle中用GROUPING SETS分组自定义汇总

    `GROUPING_ID`函数可以用来标识当前行属于哪个分组集,这对于解析结果集非常有用。 总的来说,`GROUP BY GROUPING SETS`在处理多维度分析时提供了强大的工具,允许我们定制汇总级别,同时保持查询性能的高效。它...

    oracle中聚合函数的扩展使用(ROLLUP CUBE、GROUPING()函数与ROLLUP、CUBE的结合使用等)

    当我们需要更复杂的分组和汇总信息时,可以使用扩展的聚合功能,如ROLLUP、CUBE以及GROUPING()和GROUPING_ID()函数。这些功能允许我们生成多层次的总计和小计,为数据分析提供了极大的灵活性。 1. ROLLUP子句: ...

    oracle合并列的函数wm_concat的使用详解

    在Oracle数据库中,有时我们需要将同一列中的多个值合并成一个字符串,这时就可以使用`WM_CONCAT`函数。`WM_CONCAT`是一个非标准的Oracle函数,它在Oracle 9i及以后的版本中被广泛使用,但在Oracle 11g R2版本中由于...

    使用ROLLUP函数生成报表的小计、合计

    #### 三、高级技巧:使用GROUPING_ID函数标识汇总行 为了更直观地区分汇总行和普通行,可以结合使用`GROUPING_ID`函数。`GROUPING_ID`函数返回一个整数值,该值标识了当前行是基于哪个字段的汇总。 示例如下: ``...

    oracle10g之统计与分析函数

    9. **GROUP_ID**,**GROUPING**,**GROUPING_ID**:用于多级分组统计,GROUP_ID返回唯一分组标识,GROUPING表示是否进行了分组,GROUPING_ID返回分组的位模式。 10. **MAX**,**MIN**:找出最大值和最小值。 11. **...

    oracle 分组函数

    本篇文章将详细阐述Oracle分组函数的概念、功能以及常用分组函数的使用方法。 一、分组函数概述 分组函数主要作用于一组数据上,而不是单个记录,它们用于对数据进行汇总,如计算总和、平均值、最大值、最小值等。...

    《Pro Oracle SQL》Chapter7 --7.6Eliminate NULLs with the GROUPING() Function

    GROUPING()函数是Oracle数据库提供的一种特殊函数,用于识别汇总结果中的NULL值,并且在分组操作中有着独特的应用。 NULL值在SQL中表示未知或无值,它不同于任何具体的值,包括零、空字符串等。在进行GROUP BY语句...

    SQLServer和Oracle的常用函数

    - SQL Server独有的`GROUPING_ID()`用于确定分组级别,Oracle则使用`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`等窗口函数来实现类似功能。 6. **条件函数** - `CASE`语句在两个数据库中都存在,用于基于条件进行...

    Oracle查看增加表空间语句

    其中使用了`ROLLUP`和`GROUPING`函数来实现对所有表空间或单个表空间的统计。 **示例查询:** ```sql SELECT Substr(Ta.Tablespace_Name, 1, 10) "空间名称", To_Char(Ta.Define_Size / 1048576, '999990.999') ...

    Oracle的Rollup用法

    decode(grouping_id(grade,ID),1,'小计',3,'合计',ID) ID, SUM(num) FROM a GROUP BY ROLLUP(grade,ID); 这条 SQL 语句将对 grade 和 id 字段进行分组,并生成子总计和总计。结果如下: GRADE ID SUM(NUM) -----...

    《Pro Oracle SQL》Chapter7 -- 7.7Extending Reports with GROUPING()

    在实际应用中,GROUPING ID是GROUPING函数的一个扩展,它提供了一种更直观的方式来识别多级分组。GROUPING ID返回一个数字,这个数字是一个二进制位表示的组合,每个位对应GROUP BY子句中的一个列,如果该列在当前...

    分析函数,数据库开发

    - **功能**:GROUPING_ID函数用于标记由ROLLUP或CUBE产生的汇总结果,便于识别汇总级别。 - **示例**:在使用`GROUP BY ROLLUP(Category, Brand, Model), GROUPING_ID(Category, Brand, Model)`时,可以通过GROUPING...

    rollup及cube的使用

    同时,结合使用`GROUPING`和`GROUPING_ID`函数,可以让查询结果更易于理解和分析。这些功能对于进行复杂的数据分析和报告生成都非常有用。了解并熟练掌握这些功能对于Oracle数据库的开发人员来说至关重要。

    ORACLE函数介绍

    - `GROUPING_ID`: 用于多级分组标识。 3. **分析函数**: 分析函数在聚合操作的基础上增加了行上下文,可用于窗口化操作。例如: - `RANK`, `DENSE_RANK`, `ROW_NUMBER`: 为每一行分配一个唯一的排名。 - `LAG`...

    oracle 关键函数

    #### 分组函数(Grouping Functions) 分组函数用于对数据进行汇总统计,如计算平均值、最大值、最小值等。这些函数可以使用`DISTINCT`或`ALL`关键字来控制统计时使用的行数,默认情况下为`ALL`。 - **AVG...

    ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句

    Oracle特有的GROUP_ID函数可以为每个分组生成一个唯一的标识符。这对于需要在查询中引用特定分组时非常有用。 5. **GROUPING 函数**: GROUPING函数可以用来确定某个值是否是由于GROUP BY或GROUPING SETS产生的...

Global site tag (gtag.js) - Google Analytics