SQL 中 ROLLUP 的使用方法

ROLLUP 是 SQL 中一种分组操作,它生成多个分组集的小计行和总计行,提供层次化的汇总数据。


基本语法

sql 复制代码
SELECT column1, column2, ..., aggregate_function(column)
FROM table
GROUP BY ROLLUP (column1, column2, ...);

使用示例

假设有一个销售表 sales

sql 复制代码
SELECT 
    region, 
    product, 
    SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP (region, product);

这个查询会生成:

  1. 每个地区每种产品的销售总额(最细粒度)

  2. 每个地区所有产品的销售小计

  3. 所有地区所有产品的销售总计


多列 ROLLUP

sql 复制代码
SELECT 
    year, 
    quarter, 
    month, 
    SUM(revenue) AS total_revenue
FROM financial_data
GROUP BY ROLLUP (year, quarter, month);

这会生成:

  1. 每年每季度每月的收入

  2. 每年每季度的收入小计

  3. 每年的收入小计

  4. 总收入总计

部分 ROLLUP

sql 复制代码
SELECT 
    department, 
    job_title, 
    gender, 
    AVG(salary) AS avg_salary
FROM employees
GROUP BY department, ROLLUP (job_title, gender);

结合其他 GROUP BY 功能

sql 复制代码
SELECT 
    store_id, 
    product_category, 
    product_subcategory,
    SUM(sales) AS total_sales
FROM retail_data
GROUP BY GROUPING SETS (
    (store_id, product_category, product_subcategory),
    ROLLUP (store_id, product_category)
);

识别汇总行

sql 复制代码
SELECT 
    CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
    CASE WHEN GROUPING(product) = 1 THEN 'All Products' ELSE product END AS product,
    SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP (region, product);

注意事项

  1. ROLLUP 生成的分组集是从最详细到最不详细的层次结构

  2. 列的顺序会影响结果,ROLLUP(a,b,c) 与 ROLLUP(c,b,a) 结果不同

  3. 在 MySQL 中,ROLLUP 不能与 ORDER BY 一起使用(除非使用 LIMIT)

ROLLUP 是生成层次化报表的强大工具,特别适合需要多级汇总的商业报表场景。

相关推荐
2401_891409262 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w8 小时前
SQL注入
网络·数据库·sql
tianyuanwo8 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼8 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
IvorySQL8 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
幽灵诶10 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
宇宙无敌暴龙战士66610 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊10 小时前
MySQL 的四种隔离级别
java·数据库·mysql
say_fall11 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++