当前位置: 首页 > news >正文

SQL中使用ROLLUP和CUBE函数轻松生成汇总行

在数据分析和报表制作中,通常需要对数据进行汇总和分组,我们常用的就是GROUP BY汇总数据,当我们想按照不同维度汇总时,往往需要编写多个GROUP BY预计,而借助ROLLUP 和 CUBE 函数可以一次性生成子总计和总计行,而不需要编写多个 SQL 查询语句。这样可以节省时间和精力,提高数据分析和报表制作的效率。

CUBE 和 ROLLUP 的区别

下面是 CUBE 和 ROLLUP 之间的具体区别及实例:

  • CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
  • ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
-- 创建示例表格
CREATE TABLE sales_data (date DATE,region VARCHAR(50),sales DECIMAL(10, 2)
);-- 插入示例数据
INSERT INTO sales_data (date, region, sales) VALUES('2021-01-01', 'North', 1000),('2021-01-02', 'North', 1500),('2021-01-03', 'North', 2000),('2021-01-01', 'South', 800),('2021-01-02', 'South', 1200),('2021-01-03', 'South', 1800);

1、ROLLUP示例

-- 使用 ROLLUP 函数生成子总计和总计行
SELECT date, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY ROLLUP(date, region);

输出结果:

date        region  total_sales
2021-01-01  North   1000.00
2021-01-01  South   800.00
2021-01-02  North   1500.00
2021-01-02  South   1200.00
2021-01-03  North   2000.00
2021-01-03  South   1800.00
2021-01-01  NULL    1800.00
2021-01-02  NULL    2700.00
2021-01-03  NULL    3800.00
NULL        NULL    8300.00

上面的结果中,NULL 表示总计行,包括所有日期和地区的销售额总计。

2、CUBE示例

-- 使用 CUBE 函数生成所有可能的聚合数据组合
SELECT date, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY CUBE(date, region);

输出结果:

date        region  total_sales
2021-01-01  North   1000.00
2021-01-01  South   800.00
2021-01-02  North   1500.00
2021-01-02  South   1200.00
2021-01-03  North   2000.00
2021-01-03  South   1800.00
2021-01-01  NULL    1800.00
2021-01-02  NULL    2700.00
2021-01-03  NULL    3800.00
NULL        North   4500.00
NULL        South   3800.00
NULL        NULL    8300.00

上面的结果中,NULL 表示所有日期或所有地区的小计行和总计行,例如,NULL 和 North 表示所有日期的 North 地区的小计行和总计行。

区别开表中某列自身的NULL值和的小计行的NULL(汇总行重命名)

以CUBE函数为例,在使用 CUBE 函数时,小计行的 NULL 值与表中某列的 NULL 值是不同的。在 CUBE 函数中,NULL 值表示所有列的小计行。如果您想区分表中某列的 NULL 值和 CUBE 函数中的小计行的 NULL 值,可以使用 GROUPING 函数

GROUPING 函数可用于检查指定列是否包含在 CUBE 函数的当前小计行中。如果列包含在当前小计行中,则 GROUPING 函数返回 1,否则返回 0。因此,您可以使用 GROUPING 函数来区分表中某列的 NULL 值和 CUBE 函数中的小计行的 NULL 值。

以下是一个示例 SQL 语句,演示如何使用 GROUPING 函数来区分表中某列的 NULL 值和 CUBE 函数中的小计行的 NULL 值(汇总行重命名):

SELECT CASE WHEN GROUPING(column_name) = 1 THEN 'Total' ELSE column_name END AS column_name,SUM(value)
FROM table_name
GROUP BY CUBE(column_name)

在上面的示例中,如果 column_name 列包含在 CUBE 函数的当前小计行中,GROUPING 函数将返回 1,否则返回 0。通过将 GROUPING 函数的结果与 CASE 语句结合使用,我们可以将包含在当前小计行中的列标记为 “Total”,从而区分表中某列的 NULL 值和 CUBE 函数中的小计行的 NULL 值。

http://www.lryc.cn/news/210964.html

相关文章:

  • CentOS 7 安装和配置java环境
  • 「实验记录」CS144 Lab0 networking warmup
  • html5怎么实现语音搜索
  • 吴恩达《机器学习》1-2:什么是机器学习?
  • 基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能
  • Linux环境开发工具yum、makefile的使用 【Linux】
  • 第六章(6):Python中的函数—闭包和装饰器
  • Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
  • 基于SSM的个性化美食推荐系统设计与实现
  • Django 全局配置 settings 详解
  • uniapp接口请求api封装,规范化调用
  • 色彩校正及OpenCV mcc模块介绍
  • 2023mathorcup大数据数学建模竞赛A题坑洼道路识别67页完整高质量原创论文
  • 【k8s】5、资源管理命令-声明式
  • 信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】
  • 【Flutter】Flutter 中的图片管理 图片优化的最佳实践
  • dash--项目的前端展示简单基础
  • LeetCode 面试题 16.06. 最小差
  • css-表格样式
  • Linux对网络通信的实现
  • 【开源】基于SpringBoot的车险自助理赔系统的设计和实现
  • 减少磁盘读/写中延迟时间的方法(交替编号,错位命名)
  • Perl爬虫程序
  • UE5使用Dash插件实现程序化地形场景制作
  • 23种设计模式(10)——门面模式
  • 磨人的Ts
  • 一个基于Excel模板快速生成Excel文档的小工具
  • 服务器动态/静态/住宅/原生IP都是什么意思
  • 缓解大模型幻觉问题的解决方案
  • Python装饰器进阶:深入理解与最佳实践