当前位置: 首页 > 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 值。

相关文章:

  • MySQL - 为什么索引结构默认使用B+树,而不是其他?
  • 薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特
  • CentOS 编译安装 nginx
  • 亚信科技:发挥自我优势深入AIGC,并购整合高瞻远瞩致力未来路
  • Java集合类--List集合,Set集合,Map集合
  • 【理论知识:Window Aggregation】flink 窗口聚合功能概述:两种窗口聚合模式的使用例子、功能说明
  • 【JVM】字节码文件的组成部分
  • Ajax学习笔记第二天
  • CCF中国开源大会,中电金信与行业共探AI技术在金融行业的应用和前景
  • npm 彻底卸载
  • 轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)
  • C#使用mysql-connector-net驱动连接mariadb报错
  • 【MySQL】表的增删查改
  • LuatOS-SOC接口文档(air780E)--max30102 - 心率模块
  • NSS [UUCTF 2022 新生赛]websign
  • Angular4 模板式表单用法以及验证
  • JavaScript的使用你知道几种?(上)
  • JavaWeb(学习笔记二)
  • Java多态
  • nginx 配置多 域名 + 多 https
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 记一次和乔布斯合作最难忘的经历
  • 看域名解析域名安全对SEO的影响
  • 一天一个设计模式之JS实现——适配器模式
  • puppet连载22:define用法
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​flutter 代码混淆
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​LeetCode解法汇总518. 零钱兑换 II
  • $().each和$.each的区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4)STL算法之比较
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (理论篇)httpmoudle和httphandler一览
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .htaccess配置常用技巧
  • .NET Core 项目指定SDK版本
  • .NET 中的轻量级线程安全
  • .NET/C# 使用反射注册事件
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .php文件都打不开,打不开php文件怎么办
  • .skip() 和 .only() 的使用
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [2018-01-08] Python强化周的第一天
  • [Angular] 笔记 7:模块
  • [APIO2012] 派遣 dispatching
  • [BZOJ3211]:花神游历各国(小清新线段树)