Group by RollUp&Group by CUBE&GroupBy 区别

本文详细解析了SQL中ROLLUP与CUBE分组功能的区别及应用场景。通过具体的SQL查询实例,展示了如何使用这两种分组方式来获取不同维度的数据汇总结果。

1、如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

2、如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。

举例:SQL> select grouping(index_type) g_ind,grouping(status) g_st,index_type,status,count(*) from t group by rollup(index_type,status) order by 1,2;
 
     G_IND       G_ST INDEX_TYPE                  STATUS     COUNT(*)
---------- ---------- --------------------------- -------- ----------
         0          0 LOB                         N/A               1
         0          0 LOB                         VALID           587
         0          0 FUNCTION-BASED NORMAL       VALID            16
         0          0 FUNCTION-BASED DOMAIN       VALID             1
         0          0 IOT - TOP                   VALID           103
         0          0 CLUSTER                     VALID            10
         0          0 NORMAL                      VALID          3171
         0          0 NORMAL                      N/A              94
         0          0 BITMAP                      VALID             1
         0          1 FUNCTION-BASED NORMAL                        16
         0          1 NORMAL                                     3265
         0          1 IOT - TOP                                   103
         0          1 FUNCTION-BASED DOMAIN                         1
         0          1 BITMAP                                        1
         0          1 CLUSTER                                      10
         0          1 LOB                                         588
         1          1                                            3984
 
17 rows selected

 

SQL> select grouping(index_type) g_ind,grouping(status) g_st,index_type,status,count(*) from t group by cube(index_type,status) order by 1,2;
 
     G_IND       G_ST INDEX_TYPE                  STATUS     COUNT(*)
---------- ---------- --------------------------- -------- ----------
         0          0 LOB                         N/A               1
         0          0 CLUSTER                     VALID            10
         0          0 FUNCTION-BASED NORMAL       VALID            16
         0          0 NORMAL                      VALID          3171
         0          0 IOT - TOP                   VALID           103
         0          0 LOB                         VALID           587
         0          0 FUNCTION-BASED DOMAIN       VALID             1
         0          0 BITMAP                      VALID             1
         0          0 NORMAL                      N/A              94
         0          1 IOT - TOP                                   103
         0          1 CLUSTER                                      10
         0          1 NORMAL                                     3265
         0          1 BITMAP                                        1
         0          1 LOB                                         588
         0          1 FUNCTION-BASED NORMAL                        16
         0          1 FUNCTION-BASED DOMAIN                         1
         1          0                             N/A              95
         1          0                             VALID          3889
         1          1                                            3984
 
19 rows selected

### Oracle 中 GROUP BY 的 ROLLUP CUBE 用法及区别 #### 1. **ROLLUP 的用法** `ROLLUP` 是一种扩展的 `GROUP BY` 子句,用于生成分组数据的多级汇总。它按照指定的列顺序逐级进行分组,并最终生成一个全表汇总行[^1]。例如: ```sql SELECT department_id, job_id, COUNT(*) AS employee_count FROM employees GROUP BY ROLLUP(department_id, job_id); ``` - 查询结果将首先按 `(department_id, job_id)` 分组,然后按 `department_id` 分组,最后生成全表汇总行。 - 每个层级的汇总结果会自动添加一行带有 `NULL` 值的记录来表示更高一级的汇总[^2]。 #### 2. **CUBE 的用法** `CUBE` 是另一种扩展的 `GROUP BY` 子句,用于生成所有可能的分组组合及其汇总。与 `ROLLUP` 不同,`CUBE` 不仅生成逐级汇总,还会生成所有维度的交叉汇总[^3]。例如: ```sql SELECT department_id, job_id, COUNT(*) AS employee_count FROM employees GROUP BY CUBE(department_id, job_id); ``` - 查询结果将包含以下分组:`(department_id, job_id)`、`(department_id, NULL)`、`(NULL, job_id)` `(NULL, NULL)`。 - 这意味着 `CUBE` 会生成比 `ROLLUP` 更多的汇总行,适用于需要全面分析的情况[^4]。 #### 3. **ROLLUP CUBE 的区别** - **汇总范围**:`ROLLUP` 生成逐级汇总,而 `CUBE` 生成所有可能的分组组合及其汇总[^1]。 - **结果数量**:对于相同的分组列,`CUBE` 的结果通常比 `ROLLUP` 更多,因为它包含了更多的交叉汇总[^2]。 - **适用场景**:`ROLLUP` 适合逐层分析的需求,而 `CUBE` 适合多维度交叉分析的需求[^3]。 #### 4. **示例对比** 假设有一张 `sales` 表,包含 `region`(地区)、`product`(产品) `amount`(销售额)三列。以下是 `ROLLUP` `CUBE` 的查询结果对比: - **ROLLUP 示例**: ```sql SELECT region, product, SUM(amount) AS total_sales FROM sales GROUP BY ROLLUP(region, product); ``` | region | product | total_sales | |--------|---------|-------------| | North | A | 100 | | North | B | 200 | | North | NULL | 300 | | South | A | 150 | | South | B | 250 | | South | NULL | 400 | | NULL | NULL | 700 | - **CUBE 示例**: ```sql SELECT region, product, SUM(amount) AS total_sales FROM sales GROUP BY CUBE(region, product); ``` | region | product | total_sales | |--------|---------|-------------| | North | A | 100 | | North | B | 200 | | North | NULL | 300 | | South | A | 150 | | South | B | 250 | | South | NULL | 400 | | NULL | A | 250 | | NULL | B | 450 | | NULL | NULL | 700 | #### 5. **优点与缺点** - **优点**: - 简化查询:`ROLLUP` `CUBE` 能够在一个查询中生成多个聚合级别,减少了编写多个 `GROUP BY` 查询的需求。 - 灵活性:能够快速生成不同层次的聚合数据,非常适合报表生成数据分析。 - 效率:在某些情况下,使用 `ROLLUP` `CUBE` 可以比多个单独的 `GROUP BY` 查询更高效。 - **缺点**: - 结果复杂:`CUBE` 生成的结果较多,可能导致分析时难以理解。 - 性能问题:当数据量较大时,`CUBE` 的计算开销可能较高[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值