使用 ROLLUP 计算小计
计算连续小计和总计
使用 ROLLUP 计算小计 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是 ROLLUP?
当您使用 GROUP BY 对数据进行分组时,每个组会得到一行。但很多时候,您还希望获得每个组的小计以及所有行的总计。这正是 ROLLUP 的作用。
ROLLUP 是 GROUP BY 的扩展,会自动向结果集添加额外的汇总行,在分组层级的每一层提供小计,并在末尾添加最终总计。
设置示例数据
让我们创建一个简单的 销售 表来练习。它存储每笔交易的区域、产品类别和销售金额。运行下面的语句来创建并填充该表。
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Electronics', 300),
('East', 'Clothing', 150),
('West', 'Electronics', 700),
('West', 'Clothing', 200),
('West', 'Clothing', 100);首先看普通 GROUP BY
在使用 ROLLUP 之前,让我们先看看普通的 GROUP BY 会产生什么结果。下面的查询会为每个(区域,类别)组合返回一个总计——没有小计,也没有总计。
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;介绍 GROUP BY ROLLUP
将 GROUP BY 替换为 GROUP BY ROLLUP(...) 后,SQL 就会自动添加小计行。ROLLUP() 中的列构成一个层级,并且会在该层级的每个层次生成小计,最后再生成总计。
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;读取 ROLLUP 输出
ROLLUP 结果包含三类行:
- 明细行——每个(区域,类别)组合一行,就像普通 GROUP BY 一样。
- 小计行——每个区域一行,其中
category = NULL,显示该区域的总计。 - 总计行——一行,其中区域和类别都为
NULL,显示整体总计。
这些 NULL 充当占位符,用于标记汇总层级。
使用 COALESCE 标记 NULL
NULL 标记对于最终用户来说可能不易理解。请用 COALESCE 包裹每一列,将它们替换为有意义的标签,例如 '所有类别' 和 '总计'。
SELECT
COALESCE(region, 'Grand Total') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;单列 ROLLUP
ROLLUP 也可以只处理一列。当您写下 ROLLUP(region) 时,会为每个区域生成一行,并在末尾额外生成一行总计。这是最简单的形式,适用于任何需要在明细行下方显示累计总计的报表。
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;三级 ROLLUP
您可以向 ROLLUP 传入三列或更多列,以构建更深的层级。使用 ROLLUP(year, region, category) 时,您会得到每个年份与区域的小计、每个年份的小计以及总计——每增加一列,就会增加一个汇总层级。
-- Extend the demo with a year column
SELECT
COALESCE(CAST(yr AS TEXT), 'All Years') AS year,
COALESCE(region, 'All Regions') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM (
SELECT 2024 AS yr, region, category, amount FROM sales
UNION ALL
SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP BY ROLLUP(yr, region, category)
ORDER BY yr, region, category;使用 GROUPING() 检测汇总行
GROUPING() 函数在该行中的列值是 ROLLUP 生成的 NULL(汇总占位符)时返回 1,在该值是真实数据值时返回 0。这样,您就可以区分真实的 NULL 数据和 ROLLUP 汇总产生的 NULL。
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_summary,
GROUPING(category) AS is_cat_summary
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;筛选汇总行
由于 ROLLUP 会在聚合之后添加行,因此您无法使用 WHERE 对它们进行筛选。请使用 HAVING,或将整个查询包装在子查询中。下面的示例只保留区域小计(即类别为 ROLLUP NULL、区域为真实值的行)。
SELECT region, SUM(amount) AS regional_total
FROM sales
GROUP BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
AND GROUPING(region) = 0
ORDER BY region;ROLLUP 与 GROUPING SETS
ROLLUP(a, b) 是特定 GROUPING SETS 集合的简写。下面两个查询完全等价——ROLLUP 只是省去了手动写出每个分组层级的麻烦。
-- Using ROLLUP (concise)
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);
-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS(
(region, category),
(region),
()
);快速检查
通过下面的问题测试您对 ROLLUP 的理解。
课程回顾
做得很好!下面总结您对 ROLLUP 的学习内容:
- GROUP BY ROLLUP(a, b) 会自动为列层级的每个层次生成小计,并为所有行生成总计。
- 汇总行会在被逐级汇总的列中标记为 NULL。请使用 COALESCE 为它们设置易读的标签。
- GROUPING() 函数对 ROLLUP 生成的 NULL 返回 1,对真实数据值返回 0,因此您可以将两者区分开。
- 使用 HAVING GROUPING(...) = 1 可以只筛选汇总行。
- ROLLUP(a, b) 是 GROUPING SETS((a, b), (a), ()) 的简写。
当报表需要小计和总计,而您又不想编写复杂的 UNION 查询时,ROLLUP 是首选工具。
用 AI 导师学习 SQL — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 46
- 课程
- 183
常见问题解答
「使用 ROLLUP 计算小计」课时是免费的吗?
是的 — 「使用 ROLLUP 计算小计」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「使用 ROLLUP 计算小计」这节课中我会学到什么?
计算连续小计和总计 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 ROLLUP 计算小计」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 超越单个 GROUP BY
- 使用 ROLLUP 计算小计
- 使用 CUBE 处理所有组合
- GROUPING SETS 详解