`

oracle 中 rollup、cube、grouping 使用详解

阅读更多
oracle 中 rollup、cube、grouping 使用详解 -- 使用oracle 样例表演示 转自namesliu

-- 使用oracle 的样列库,演示 rollup, cube, grouping 的用法与使用场景 
 
--- ROLLUP , 为了理解分组的成员数量,我增加了 分组的计数  COUNT(SAL) 
  SELECT   E1.DEPTNO, 
           JOB, 
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'), 
           SUM (SAL), 
           COUNT (SAL) 
    FROM   emp e1 
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE); 
 
/* 
分组情况为: 
DEPTNO,job,HIREDATE   第 1 种分组  (A,B,C)  
DEPTNO,job,           第 2 种分组  (A,B)   
DEPTNO                 第 3 种分组  (A)   
                       总分一个组 
                        
-- 结果如下:  并进行部分数据解释,以便读者理解 
    DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL) 
---------- --------- ---------- ---------- ---------- 
        10 CLERK     1982-01-23       1300          1   (A,B,C)  -- 10号部门,CLERK工种,入职日期为1982-01-23,只有一个成员 工资和为:1300 
        10 CLERK                      1300          1   (A,B)    -- 10号部门,CLERK工种,只有一个成员 工资和为:1300 
        10 MANAGER   1981-06-09       2450          1   (A,B,C)  -- 与第一条记录相似的分析  
        10 MANAGER                    2450          1   (A,B) 
        10 PRESIDENT 1981-11-17       5000          1   (A,B,C)   
        10 PRESIDENT                  5000          1   (A,B,C) 
        10                            8750          3   (A)      -- 10号部门有3个成员,工资总计为8750 
        20 CLERK     1980-12-17        800          1 
        20 CLERK                       800          1 
        20 ANALYST   1981-12-03       3000          1 
        20 ANALYST                    3000          1 
        20 MANAGER   1981-04-02       2975          1 
        20 MANAGER                    2975          1 
        20                            6775          3 
        30 CLERK     1981-12-03        950          1 
        30 CLERK                       950          1 
        30 MANAGER   1981-05-01       2850          1 
        30 MANAGER                    2850          1 
        30 SALESMAN  1981-02-20       1600          1 
        30 SALESMAN  1981-02-22       1250          1 
        30 SALESMAN  1981-09-08       1500          1 
        30 SALESMAN  1981-09-28       1250          1 
        30 SALESMAN                   5600          4    (A,B)    -- 30号部门,SALESMAN工种,有4个成员 工资和为:5600  
        30                            9400          6    (A)      -- 30号部 有6个成员, 工资总计为:9400  
                                     24925         12     ()      -- 所有部门工资总和为:24925                         
*/ 
 
 
--- CUBE , 为了理解分组的成员数量,我增加了 分组的计数  COUNT(SAL) 
  SELECT   E1.DEPTNO, 
           JOB, 
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD'), 
           SUM (SAL), 
           COUNT (SAL) 
    FROM   emp e1 
GROUP BY   CUBE (E1.DEPTNO, E1.JOB, E1.HIREDATE); 
 
/* 
分组原则: 
GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 
 
-- 结果 :  并进行部分数据解释,以便读者理解 
    DEPTNO JOB       TO_CHAR(E1   SUM(SAL) COUNT(SAL) 
---------- --------- ---------- ---------- ---------- 
                                     24925         12   -- 全表分组,工资总合:24925  
                     1980-12-17        800          1    
                     1981-02-20       1600          1 
                     1981-02-22       1250          1 
                     1981-04-02       2975          1 
                     1981-05-01       2850          1 
                     1981-06-09       2450          1 
                     1981-09-08       1500          1 
                     1981-09-28       1250          1 
                     1981-11-17       5000          1 
                     1981-12-03       3950          2   (C)  1981-12-03 入职的有2位员工,工资总计3950 
                     1982-01-23       1300          1 
           CLERK                      3050          3   (B) CLERK 工种,共计有3位员工,工资总计:3050 
           CLERK     1980-12-17        800          1 
           CLERK     1981-12-03        950          1 
           CLERK     1982-01-23       1300          1 
           ANALYST                    3000          1 
           ANALYST   1981-12-03       3000          1 
           MANAGER                    8275          3 
           MANAGER   1981-04-02       2975          1 
           MANAGER   1981-05-01       2850          1 
           MANAGER   1981-06-09       2450          1 
           SALESMAN                   5600          4 
           SALESMAN  1981-02-20       1600          1 
           SALESMAN  1981-02-22       1250          1 
           SALESMAN  1981-09-08       1500          1 
           SALESMAN  1981-09-28       1250          1 
           PRESIDENT                  5000          1 
           PRESIDENT 1981-11-17       5000          1 
        10                            8750          3 
        10           1981-06-09       2450          1 
        10           1981-11-17       5000          1 
        10           1982-01-23       1300          1 
        10 CLERK                      1300          1 
        10 CLERK     1982-01-23       1300          1 
        10 MANAGER                    2450          1 
        10 MANAGER   1981-06-09       2450          1 
        10 PRESIDENT                  5000          1 
        10 PRESIDENT 1981-11-17       5000          1 
        20                            6775          3  (A) -- 20号部 有3个成员, 工资总计为:6775  
        20           1980-12-17        800          1 
        20           1981-04-02       2975          1 
        20           1981-12-03       3000          1 
        20 CLERK                       800          1 
        20 CLERK     1980-12-17        800          1 
        20 ANALYST                    3000          1 
        20 ANALYST   1981-12-03       3000          1 
        20 MANAGER                    2975          1 
        20 MANAGER   1981-04-02       2975          1 
        30                            9400          6  (A) -- 30号部 有6个成员, 工资总计为:9400  
        30           1981-02-20       1600          1 
        30           1981-02-22       1250          1 
        30           1981-05-01       2850          1 
        30           1981-09-08       1500          1 
        30           1981-09-28       1250          1 
        30           1981-12-03        950          1 
        30 CLERK                       950          1 
        30 CLERK     1981-12-03        950          1 
        30 MANAGER                    2850          1 
        30 MANAGER   1981-05-01       2850          1 
        30 SALESMAN                   5600          4  (A、B) 30号部门,  SALESMAN 工种,有4 个成员,工资总计:5600 
        30 SALESMAN  1981-02-20       1600          1   
        30 SALESMAN  1981-02-22       1250          1 
        30 SALESMAN  1981-09-08       1500          1  (A、B、C)  0号部门,  SALESMAN 工种,1981-09-08入职,1 个员工,工资总计:1500 
        30 SALESMAN  1981-09-28       1250          1  (A、B、C)  0号部门,  SALESMAN 工种,1981-09-28入职,1 个员工,工资总计:1250 
 
已选择65行。 
*/ 
 
--- GROUPING函数 
/* 
GROUPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。 
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。 
 
语法:  GROUPING ( column_name ) 
 
是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。 
 
返回类型: int 
 
分组用于区分由 CUBE 和 ROLLUP 返回的空值和标准的空值。作为CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,意思是"全体"。 
*/ 
 
-- grouping 样列 
  SELECT   E1.DEPTNO, 
           JOB, 
           TO_CHAR (E1.HIREDATE, 'YYYY-MM-DD') HIREDATE, 
           SUM (SAL), 
           COUNT (SAL), 
           GROUPING (E1.DEPTNO) d, 
           GROUPING (JOB) j, 
           GROUPING (E1.HIREDATE) h 
    FROM   emp e1 
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE); 
 
 
 
/* 
-- 结果 :  并进行部分数据解释,以便读者理解 
 
    DEPTNO JOB       HIREDATE     SUM(SAL) COUNT(SAL)   D   J   H 
---------- --------- ---------- ---------- ---------- --- --- --- 
        10 CLERK     1982-01-23       1300          1   0   0   0   所有列都有数据作为分组,所以全为 0 
        10 CLERK                      1300          1   0   0   1   DEPTNO JOB列 有数据,而HIREDATE没有数据,所以 H 列产生的值为:1 
        10 MANAGER   1981-06-09       2450          1   0   0   0     
        10 MANAGER                    2450          1   0   0   1 
        10 PRESIDENT 1981-11-17       5000          1   0   0   0 
        10 PRESIDENT                  5000          1   0   0   1 
        10                            8750          3   0   1   1 
        20 CLERK     1980-12-17        800          1   0   0   0 
        20 CLERK                       800          1   0   0   1 
        20 ANALYST   1981-12-03       3000          1   0   0   0 
        20 ANALYST                    3000          1   0   0   1 
        20 MANAGER   1981-04-02       2975          1   0   0   0 
        20 MANAGER                    2975          1   0   0   1 
        20                            6775          3   0   1   1 
        30 CLERK     1981-12-03        950          1   0   0   0 
        30 CLERK                       950          1   0   0   1 
        30 MANAGER   1981-05-01       2850          1   0   0   0 
        30 MANAGER                    2850          1   0   0   1 
        30 SALESMAN  1981-02-20       1600          1   0   0   0 
        30 SALESMAN  1981-02-22       1250          1   0   0   0 
        30 SALESMAN  1981-09-08       1500          1   0   0   0 
        30 SALESMAN  1981-09-28       1250          1   0   0   0 
        30 SALESMAN                   5600          4   0   0   1 
        30                            9400          6   0   1   1 
                                     24925         12   1   1   1    
*/ 
 
 
-- 应用 grouping   
SELECT   CASE 
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 0) 
                   THEN DEPTNO|| ' '|| JOB|| ' ' || TO_CHAR (HIREDATE, 'YYYY-MM-DD')|| ' subtotal:' 
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 0 AND GROUPING (HIREDATE) = 1) 
                   THEN DEPTNO || ' ' || JOB || ' subtotal:' 
              WHEN (    GROUPING (E1.DEPTNO) = 0 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1) 
                   THEN DEPTNO || ' subtotal:' 
              WHEN (    GROUPING (E1.DEPTNO) = 1 AND GROUPING (JOB) = 1 AND GROUPING (HIREDATE) = 1) 
                   THEN 'Total:' 
           END 
              "Total",  
           SUM (SAL), COUNT (SAL) 
    FROM   emp e1 
GROUP BY   ROLLUP (E1.DEPTNO, E1.JOB, E1.HIREDATE); 
 
-- 结果如下: 
/* 
Total                                  SUM(SAL) COUNT(SAL) 
------------------------------------ ---------- ---------- 
10 CLERK 1982-01-23 subtotal:              1300          1   (A,B,C) 分组 
10 CLERK subtotal:                         1300          1   (A,B) 分组 
10 MANAGER 1981-06-09 subtotal:            2450          1 
10 MANAGER subtotal:                       2450          1 
10 PRESIDENT 1981-11-17 subtotal:          5000          1 
10 PRESIDENT subtotal:                     5000          1 
10 subtotal:                               8750          3  (A) 分组 10号部门,共3个成员,工资总计:8750 
20 CLERK 1980-12-17 subtotal:               800          1 
20 CLERK subtotal:                          800          1 
20 ANALYST 1981-12-03 subtotal:            3000          1 
20 ANALYST subtotal:                       3000          1 
20 MANAGER 1981-04-02 subtotal:            2975          1 
20 MANAGER subtotal:                       2975          1 
20 subtotal:                               6775          3 
30 CLERK 1981-12-03 subtotal:               950          1 
30 CLERK subtotal:                          950          1 
30 MANAGER 1981-05-01 subtotal:            2850          1 
30 MANAGER subtotal:                       2850          1 
30 SALESMAN 1981-02-20 subtotal:           1600          1 
30 SALESMAN 1981-02-22 subtotal:           1250          1 
30 SALESMAN 1981-09-08 subtotal:           1500          1 
30 SALESMAN 1981-09-28 subtotal:           1250          1 
30 SALESMAN subtotal:                      5600          4 
30 subtotal:                               9400          6 
Total:                                    24925         12  () 全部总计:12 个成员,工资总计为:24925 
 
已选择25行。 
*/ 
分享到:
评论

相关推荐

    Oracle ROLLUP和CUBE 用法

    本文将详细介绍这两个概念以及如何在实际应用中使用它们。 首先,我们来理解`ROLLUP`。ROLLUP操作是GROUP BY的一个扩展,它允许你生成一个包含不同层次的分组结果,从最细粒度的分组到最粗粒度的分组,类似于数据...

    rollup cube grouping sets的用法

    在数据库查询语言 SQL 中,`ROLLUP`, `CUBE`, 和 `GROUPING SETS` 是三个重要的概念,它们主要用于处理多维度数据的汇总和分组问题,使得数据分析更加灵活高效。接下来,我们将详细介绍这三个概念的原理、语法以及...

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

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

    Sql学习第四天——SQL 关于with cube,with rollup和grouping解释及演示

    `CUBE`和`ROLLUP`是`WITH`子句中的两个特殊运算符,它们主要用于多维度数据分析和聚合操作,通常在`GROUP BY`语句中配合使用。 1. **CUBE运算符**: `CUBE`生成的结果集包含了所有可能的子集,即所选列中值的所有...

    GROUP BY子句(rollup,cube,grouping sets)实例说明

    GROUP BY 子句(rollup, cube, grouping sets)实例说明 GROUP BY 子句是 SQL 语言中用于分组数据的关键字,它可以根据一个或多个列对数据进行分组,并对每个分组应用聚合函数,以便计算和输出所需的结果。GROUP BY...

    Oracle的Rollup用法

    Oracle 的 Rollup 用法是指在 SQL 语句中使用 ROLLUP 子句来对数据进行聚合和分组。ROLLUP 子句可以将查询结果按照一个或多个字段进行分组,并且可以生成子总计和总计。 在 Oracle 中,ROLLUP 子句可以与 GROUP BY ...

    rollup及cube的使用

    ### Oracle中的ROLLUP与CUBE使用详解 在Oracle数据库中,`ROLLUP`与`CUBE`是非常重要的分组函数,被广泛应用于数据汇总、数据分析等场景中。这两个功能可以帮助开发人员快速地对数据进行多维度分析,是开发人员必备...

    rollup,cube,grouping sets()的个人理解

    ### rollup、cube、grouping sets()的理解及应用 在SQL查询中,当我们需要对数据进行多维度的分组统计时,经常会用到`GROUP BY`子句来完成这一任务。而在更复杂的场景下,为了方便地处理多级别的汇总数据,SQL提供...

    oracle中的grouping

    ### Oracle中的Grouping功能详解 在Oracle数据库中,`GROUPING`函数被广泛应用于复杂的分组查询之中,尤其是在存储过程的开发中。本文将详细解释`GROUPING`函数的使用方法及其应用场景,并通过一个示例来帮助理解其...

    grouping or grouping_id in ORACLE

    下面将详细介绍这两者的工作原理以及如何在实际查询中使用它们。 ### GROUPING `GROUPING` 函数用于标识每个汇总行是否属于特定的分组级别。它返回一个数值结果,其中: - 0 表示该列参与了当前的分组。 - 1 表示...

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

    与`GROUP BY ROLLUP`和`GROUP BY CUBE`相比,`GROUPING SETS`更具有选择性,可以精确地控制生成的汇总组。`ROLLUP`生成所有可能的子集,而`CUBE`则生成所有可能的组合,这两者可能会产生大量的结果,尤其是在处理多...

    Oracle分组函数之ROLLUP的基本用法

    本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as select * from scott.dept; create table emp as select * from ...

    cube与rollup学习总结

    在使用`CUBE`或`ROLLUP`时,为了区分哪些字段被分组了,哪些没有被分组,通常会使用`GROUPING`函数。`GROUPING`函数会根据其参数是否被分组返回一个值:如果参数未被分组,则返回0;如果参数被分组,则返回1。 **...

    SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE

    然而,GROUP BY还可以与GROUPING、ROLLUP和CUBE运算符结合使用,以实现更复杂的多维度汇总功能。这些高级的汇总方法在数据分析和报表生成中非常有用,尤其是在处理大型数据集时。 GROUPING运算符主要用于识别汇总行...

    SQL语句中Group BY 和Rollup以及cube用法

    ### SQL语句中Group BY 和Rollup以及Cube用法 #### Group BY 子句 `GROUP BY`子句是SQL查询中的一个非常重要的部分,它用于将数据表中的行按照一个或多个列进行分组,使得可以对每个分组执行聚合函数(如SUM、...

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

    本文主要探讨如何利用SQL中的`ROLLUP`函数来实现这一功能,特别关注于Oracle数据库环境下的实现方法。 #### 一、基本概念介绍 `ROLLUP`是一个用于GROUP BY子句的扩展选项,它能够帮助我们生成包含不同层级汇总信息...

    SQL语句中Group BY 和Rollup以及cube用法.txt

    SQL Server中的用法为group by colomn with [rollup|cube],首先要弄明白rollup 和cube,就要知道group by的用法,group by 为对列进行分组,只展现分组统计的值,而 rollup 为分层次展现,cube 为展现列中所有层次...

    《Pro Oracle SQL》Chapter7 Advanced Grouping -- 7.5Putting CUBE To Work

    在7_11_os.sql和7_12_os.sql这两个文件中,我们可以预期它们包含了示例查询和数据,用于演示如何在实际环境中使用CUBE。通常,这样的脚本会展示如何构建CUBE查询,以及如何解释和理解返回的结果。通过运行这些脚本,...

    oracle--rollup 和cube分组累计求和

    NULL 博文链接:https://wangjingyi.iteye.com/blog/1545090

Global site tag (gtag.js) - Google Analytics