SQL ROLLUP通过GROUP BY的扩展实现多级分层聚合,按指定列顺序生成小计和总计,相比传统UNION ALL更简洁高效,适用于财务、销售等需层级汇总的场景。

SQL
ROLLUP
GROUP BY
UNION ALL
要实现
SQL ROLLUP
假设我们有一个销售数据表
sales
year
region
product
amount
使用
ROLLUP
GROUP BY ROLLUP(col1, col2, ...)
例如,
GROUP BY ROLLUP(year, region, product)
(year, region, product)
GROUP BY
(year, region)
(year)
()
下面是一个具体的 SQL 示例:
SELECT
year,
region,
product,
SUM(amount) AS total_amount
FROM
sales
GROUP BY
ROLLUP(year, region, product)
ORDER BY
year NULLS FIRST,
region NULLS FIRST,
product NULLS FIRST;在这个查询中,
ROLLUP(year, region, product)
NULL
region
product
NULL
ROLLUP
为了让结果更易读,我们可以使用
COALESCE
NULL
SELECT
COALESCE(CAST(year AS VARCHAR), 'Total Year') AS year_summary,
COALESCE(region, 'Total Region') AS region_summary,
COALESCE(product, 'Total Product') AS product_summary,
SUM(amount) AS total_amount
FROM
sales
GROUP BY
ROLLUP(year, region, product)
ORDER BY
year NULLS FIRST,
region NULLS FIRST,
product NULLS FIRST;通过这种方式,我们就能在一个查询中,清晰、高效地实现多层级的数据聚合和汇总。
SQL ROLLUP
GROUP BY
GROUP BY
GROUP BY year, region
而
ROLLUP
GROUP BY
GROUP BY
UNION ALL
ROLLUP
ROLLUP
ROLLUP
GROUP BY
UNION ALL
ROLLUP
UNION ALL
ROLLUP
ROLLUP
它更具优势的场景包括:
任何需要“总计中包含小计,小计中包含更小计”这种层级结构报告的场景,
ROLLUP
在
ROLLUP
NULL
NULL
我们用
ROLLUP(year, region)
(2023, North, 100)
(2023, NULL, 500)
region
NULL
NULL
region
(NULL, NULL, 1200)
year
region
NULL
一开始看到
NULL
ROLLUP
GROUPING
GROUPING
ROLLUP
NULL
GROUPING(column_name)
GROUPING(column_name)
1
NULL
GROUPING(column_name)
0
NULL
这在实践中非常有用,因为它允许你区分真正的
NULL
ROLLUP
NULL
实际应用示例:
我们可以利用
GROUPING
NULL
SELECT
CASE WHEN GROUPING(year) = 1 THEN 'Total Year' ELSE CAST(year AS VARCHAR) END AS year_summary,
CASE WHEN GROUPING(region) = 1 THEN 'Total Region' ELSE region END AS region_summary,
CASE WHEN GROUPING(product) = 1 THEN 'Total Product' ELSE product END AS product_summary,
SUM(amount) AS total_amount,
GROUPING(year) AS is_year_rollup,
GROUPING(region) AS is_region_rollup,
GROUPING(product) AS is_product_rollup
FROM
sales
GROUP BY
ROLLUP(year, region, product)
ORDER BY
year NULLS FIRST,
region NULLS FIRST,
product NULLS FIRST;通过
GROUPING
GROUPING
在 SQL 的高级聚合功能中,除了
ROLLUP
CUBE
GROUPING SETS
GROUP BY
ROLLUP
ROLLUP
ROLLUP(A, B, C)
(A, B, C)
(A, B)
(A)
()
C -> B -> A
CUBE
CUBE
CUBE(A, B)
(A, B)
(A)
(B)
()
CUBE(A, B, C)
2^3 = 8
(A, B, C), (A, B), (A, C), (B, C), (A), (B), (C), ()
CUBE
GROUPING SETS
GROUPING SETS
GROUP BY
GROUPING SETS
GROUP BY GROUPING SETS((A, B), (C), ())
(A, B)
(C)
()
ROLLUP
CUBE
GROUPING SETS
我个人觉得,
ROLLUP
CUBE
GROUPING SETS
简单代码示例:
-- CUBE 示例
SELECT
COALESCE(CAST(year AS VARCHAR), 'Total Year') AS year_summary,
COALESCE(region, 'Total Region') AS region_summary,
SUM(amount) AS total_amount
FROM
sales
GROUP BY
CUBE(year, region)
ORDER BY
year NULLS FIRST,
region NULLS FIRST;
-- GROUPING SETS 示例
-- 假设我只想看 (year, region) 的聚合 和 仅按 product 的聚合,以及总计
SELECT
COALESCE(CAST(year AS VARCHAR), 'Total Year') AS year_summary,
COALESCE(region, 'Total Region') AS region_summary,
COALESCE(product, 'Total Product') AS product_summary,
SUM(amount) AS total_amount
FROM
sales
GROUP BY
GROUPING SETS(
(year, region), -- 按年和区域聚合
(product), -- 仅按产品聚合
() -- 总计
)
ORDER BY
year NULLS FIRST,
region NULLS FIRST,
product NULLS FIRST;选择哪个,最终取决于你的具体分析目标和报表需求。理解它们的区别,能让你在数据处理时更加得心应手。
以上就是SQLROLLUP怎么实现分层聚合_SQLROLLUP分层汇总用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号