首页/数据/NoSQL 速查/GROUP BY 修饰符与汇总行
ClickHouse56 条

GROUP BY 修饰符与汇总行

GROUP BY 支持 WITH ROLLUP、WITH CUBE、WITH TOTALS:在小计、交叉汇总与总计行上与普通分组一起返回,适合报表类查询一次取全口径。

NoSQL 速查数据更新于 2026-10-13

GROUP BY 修饰符是什么

ClickHouse 的 GROUP BY 支持 WITH ROLLUP、WITH CUBE 与 WITH TOTALS:ROLLUP 按分组列从右向左逐级做小计,CUBE 输出所有列组合的小计,WITH TOTALS 额外返回一行不分组的总计。它们让报表类查询一次取到各级口径,省掉多次查询与应用层拼接。汇总行的键列会用默认值填充(空字符串或 0),展示时需要与真实分组值区分开。

基本信息

WITH ROLLUP按分组列从右向左逐级小计
WITH CUBE输出所有列组合的小计
WITH TOTALS额外输出一行不分组的总计
汇总行键值用默认值填充(空串或 0)
所属系统ClickHouse

典型使用场景

  • 多维报表:地区与产品两个维度一次取出小计与明细
  • 交叉汇总:用 CUBE 得到所有维度组合的统计
  • 总量核对:WITH TOTALS 取总计并与明细行相加比对
  • 减少查询次数:一次拿到各级粒度,避免多次往返
  • 前端展开树:按层级展示可折叠的汇总结构

写法示例

写法示例
SELECT
    region,
    product,
    sum(amount) AS total
FROM sales
GROUP BY region, product
WITH ROLLUP                    -- 依次产出 (region,product)、(region)、总计
ORDER BY region, product;

修饰符读法

修饰符输出注意
WITH ROLLUP逐级小计层级顺序按分组列从右向左
WITH CUBE所有组合小计维度多时结果行数增长快
WITH TOTALS一行不分组总计键列为默认值
汇总行键值为默认值展示时要与真实值区分
结果规模与维度基数相关组合维度过高要预估行数
汇总行的键列是默认值填充(空字符串、0 等),前端展示时务必与真实取值区分,否则会出现「空地区」这种误导性分组。
WITH TOTALS 的总计行在分布式表上的行为需要按版本验证,跨节点报表上线前先在小范围核对结果是否符合预期。
组合维度过高时 CUBE 的输出行数会快速增长,先按各维度的基数估算结果规模,再决定是否使用这个修饰符。
ROLLUP 与 TOTALS 可以同时使用,输出里既有逐级小计也有一行总计;解析结果时按键列是否为空区分汇总行与明细行。

易错点

  • WITH TOTALS 的总计行在单机聚合中可直接使用,分布式表上行为需按版本验证
  • 组合维度过高时 CUBE 输出行数会快速增长,先估算结果规模
  • 把汇总行的默认值当成真实分组值参与二次统计,结果会翻倍
  • ROLLUP 的输出层级与分组列的书写顺序相关,调整列顺序会改变结果结构

数据来源与参考

  • ClickHouse Docs: GROUP BY clause (WITH ROLLUP/CUBE/TOTALS)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌