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 是生成层次化报表的强大工具,特别适合需要多级汇总的商业报表场景。

相关推荐
problc15 分钟前
大模型API和秘钥获取地址
数据库·redis·缓存
Antonio91516 分钟前
【Redis】Linux 配置Redis
linux·数据库·redis
qq_463944861 小时前
如何把Excel文件导入Navicat?
数据库·excel
不太厉害的程序员1 小时前
Excel 将数据导入到SQLServer数据库
数据库·sqlserver·excel
技术卷3 小时前
详解力扣高频SQL50题之610. 判断三角形【简单】
sql·leetcode·oracle
betazhou3 小时前
MySQL ROUTER安装部署
android·数据库·mysql·adb·mgr·mysql router
中东大鹅3 小时前
Mybatis Plus 多数据源
java·数据库·spring boot·后端·mybatis
一枚小小程序员哈4 小时前
springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现
数据库·spring boot·mysql·spring·java-ee·intellij-idea
Antonio9154 小时前
【Redis】 Redis 基础命令和原理
数据库·redis·缓存
非优秀程序员4 小时前
未来的编程将会是什么样子?从面向对象转为面向业务数据!!
数据库·架构