博客
关于我
Oracle的聚合函数group by结合CUBE和ROLLUP的使用
阅读量:794 次
发布时间:2023-02-26

本文共 3155 字,大约阅读时间需要 10 分钟。

Oracle Cube与Rollup函数的区别及应用场景

在Oracle SQL中,CUBEROLLUP是常用的聚合函数,用于根据指定的列对数据进行分组和统计。本文将详细解释两者之间的区别以及各自的应用场景。

1. CUBE函数

CUBE函数用于在GROUP BY子句中对多个列进行分组。其基本语法格式如下:

SELECT ... GROUP BY CUBE (grouping_column_reference_list)

例子说明

以下示例展示了CUBE函数在实际应用中的效果:

SELECT channel_desc, calendar_month_desc, countries.country_iso_code, 
TO_CHAR(SUM(amount_sold), '9,999,999,999') SALES$
FROM sales, customers, times, channels, countries
WHERE sales.time_id=times.time_id
AND sales.cust_id=customers.cust_id
AND sales.channel_id= channels.channel_id
AND customers.country_id = countries.country_id
AND channels.channel_desc IN ('Direct Sales', 'Internet')
AND times.calendar_month_desc IN ('2000-09', '2000-10')
AND countries.country_iso_code IN ('GB', 'US')
GROUP BY CUBE(channel_desc, calendar_month_desc, countries.country_iso_code);

输出结果如下:

CHANNEL_DESC CALENDAR_CO SALES$
Internet 2000-09 140,793
Internet 2000-10 151,593
Direct Sales 2000-09 723,424
Direct Sales 2000-10 774,222
Internet GB 16,569
Internet US 124,224
Direct Sales GB 85,223
Direct Sales US 638,201
Internet GB 14,539
Internet US 137,054
Direct Sales GB 91,925
Direct Sales US 682,297
Internet 292,387
Direct Sales 1,497,646

通过上述示例可以看出,CUBE函数会根据指定的多个列对数据进行分组,生成多级聚合结果。

2. ROLLUP函数

ROLLUP函数同样用于GROUP BY子句中,但与CUBE函数的区别在于,它会对指定的列逐步进行聚合,生成从单个值到多个值的聚合结果。其基本语法格式如下:

SELECT ... GROUP BY ROLLUP(grouping_column_reference_list)

例子说明

以下示例展示了ROLLUP函数的实际应用效果:

SELECT channels.channel_desc, calendar_month_desc, 
countries.country_iso_code,
TO_CHAR(SUM(amount_sold), '9,999,999,999') SALES$
FROM sales, customers, times, channels, countries
WHERE sales.time_id=times.time_id
AND sales.cust_id=customers.cust_id
AND customers.country_id = countries.country_id
AND sales.channel_id = channels.channel_id
AND channels.channel_desc IN ('Direct Sales', 'Internet')
AND times.calendar_month_desc IN ('2000-09', '2000-10')
AND countries.country_iso_code IN ('GB', 'US')
GROUP BY ROLLUP(channels.channel_desc, calendar_month_desc, countries.country_iso_code);

输出结果如下:

CHANNEL_DESC CALENDAR_CO SALES$
Internet 2000-09 140,793
Internet 2000-10 151,593
Direct Sales 2000-09 723,424
Direct Sales 2000-10 774,222
Internet 292,387
Direct Sales 1,497,646
Internet GB 16,569
Internet US 124,224
Direct Sales GB 85,223
Direct Sales US 638,201
Internet GB 14,539
Internet US 137,054
Direct Sales GB 91,925
Direct Sales US 682,297
通过上述示例可以看出,`ROLLUP`函数会对多个列逐步进行聚合,生成从单个值到多个值的多级聚合结果。
## 3. CUBE与ROLLUP的区别
- **`CUBE`函数**:会根据指定的多个列生成多级聚合结果,但不会对单独的列进行逐步聚合。
- **`ROLLUP`函数**:会对指定的多个列逐步进行聚合,生成从单个值到多个值的多级聚合结果。
### 统计列的区别
- **`CUBE(a, b)`**:统计列包含 `(a, b)`、`(a)`、`()`。
- **`ROLLUP(a, b)`**:统计列包含 `(a, b)`、`(a)`、`(b)`、`()`。
- **`CUBE(a, b, c)`**:统计列包含 `(a, b, c)`、`(a, b)`、`(a, c)`、`(b, c)`、`(a)`、`(b)`、`(c)`、`()`。
- **`ROLLUP(a, b, c)`**:统计列包含 `(a, b, c)`、`(a, b)`、`(a, c)`、`(b, c)`、`(a)`、`(b)`、`(c)`、`()`。
通过上述对比可以看出,`CUBE`函数生成的统计列更复杂,适合需要多级分组的场景,而`ROLLUP`函数则更适合对多个列进行逐步聚合。
## 4. 应用场景
- **`CUBE`函数**:适用于需要多个列同时进行分组的场景,尤其是在多维数据分析中。
- **`ROLLUP`函数**:适用于需要对多个列进行逐步聚合的场景,常用于生成从单个值到多个值的多级统计结果。
## 5. 总结
在Oracle SQL中,`CUBE`和`ROLLUP`函数都是用来对多个列进行分组和统计的聚合函数,但两者的应用场景和统计结果有显著差异。理解这些差异并根据实际需求选择合适的函数,可以显著提升数据分析的效果。

转载地址:http://drpfk.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计
查看>>
OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
查看>>
OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
查看>>
OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
查看>>
OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
查看>>
OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
查看>>
OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
查看>>
OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
查看>>
OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
查看>>
OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
查看>>
OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
查看>>
OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 深度学习检测小目标常用方法
查看>>
Opencv中KNN背景分割器
查看>>
OpenCV中基于已知相机方向的透视变形
查看>>
OpenCV中的监督学习
查看>>
opencv中读写视频
查看>>