使用mysql中的with rollup得到group by的汇总信息

本文介绍如何在 MySQL 中使用 WITH ROLLUP 子句来获取分组数据及其汇总信息。通过具体示例展示了使用 WITH ROLLUP 后如何得到各分组的汇总数据,并给出对比效果。

使用mysql中的with rollup可以得到每个分组的汇总级别的数据:

 

表如下:

CREATE TABLE `test3` (
  `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
  `name1` varchar(10) DEFAULT NULL,
  `name2` varchar(10) DEFAULT NULL,
  `cnt` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

 

数据为:

1 rank1 subrank1 1
2 rank1 subrank1 2
3 rank2 subrank1 1
4 rank2 subrank2 2
5 rank3 subrank1 1
6 rank1 subrank2 3

查询(1):

select name1,name2,sum(cnt) from test3 group by name1,name2

得到结果:

rank1 subrank1 3
rank1 subrank2 3
rank2 subrank1 1
rank2 subrank2 2
rank3 subrank1 1

查询(2):

select name1,name2,sum(cnt) from test3 group by name1,name2 with rollup

得到结果:

rank1 subrank1 3
rank1 subrank2 3
rank1 NULL        6
rank2 subrank1 1
rank2 subrank2 2
rank2 NULL        3
rank3 subrank1 1
rank3 NULL        1
NULL  NULL        10

可以看到多出了汇总信息

MySQL 中的 `WITH ROLLUP` 是 `GROUP BY` 子句的一个扩展功能,主要用于生成多层级的汇总数据。它在数据分析和报表生成中非常有用,尤其是在需要对多个维度进行分组并计算总计或小计时。 ### 基本用法 当使用 `WITH ROLLUP` 时,MySQL 会在结果集中添加额外的汇总行,这些行代表了不同层次的聚合结果。通常情况下,`WITH ROLLUP` 会按照 `GROUP BY` 列表中的列顺序逐级进行汇总。 例如,假设有一个名为 `sales` 的表,包含以下字段:`sale_date`(销售日期)、`product`(产品名称)和 `amount`(销售额)。如果想要按日期和产品分组,并且希望得到每个日期的总销售额以及所有日期的总销售额,可以使用如下查询: ```sql SELECT sale_date, product, SUM(amount) AS total FROM sales GROUP BY sale_date, product WITH ROLLUP; ``` 在这个例子中,`WITH ROLLUP` 将产生两种类型的汇总行: - 每个 `sale_date` 分组下的所有产品的总销售额。 - 整个结果集的总销售额。 为了更清晰地表示汇总行,可以使用 `COALESCE` 函数来替换 NULL 值,这样可以让汇总行更容易被识别。比如,将上面的例子稍作修改以提高可读性: ```sql SELECT COALESCE(sale_date, 'Total') AS sale_date, COALESCE(product, 'All Products') AS product, SUM(amount) AS total FROM sales GROUP BY sale_date, product WITH ROLLUP; ``` 这里,`COALESCE` 函数用来替换 `NULL` 值为更具描述性的字符串,如 "Total" 或 "All Products",使得最终用户能够直观理解哪一行是汇总行[^1]。 ### 高级用法与过滤 有时候可能只关心特定级别的汇总信息,而不是所有的汇总级别。在这种情况下,可以通过 `HAVING` 子句来过滤掉不需要的汇总行。例如,如果我们只想保留每个 `sale_date` 的汇总以及整个结果集的总和,可以这样做: ```sql SELECT COALESCE(sale_date, 'Total') AS sale_date, COALESCE(product, 'All Products') AS product, SUM(amount) AS total FROM sales GROUP BY sale_date, product WITH ROLLUP HAVING (sale_date IS NOT NULL AND product IS NOT NULL) OR (sale_date IS NULL AND product IS NULL); ``` 此查询通过 `HAVING` 条件排除了中间层级的汇总行,仅保留了每个 `sale_date` 下的具体产品销售记录以及最后的总体总和[^3]。 ### 注意事项 - 使用 `WITH ROLLUP` 时需要注意其对性能的影响,特别是在处理大量数据时。因为 `WITH ROLLUP` 可能会导致额外的计算开销。 - 在设计包含 `WITH ROLLUP` 的查询时,应仔细考虑如何组织 `GROUP BY` 后面的列顺序,因为它直接影响到生成的汇总层次结构。 - 如果发现 `WITH ROLLUP` 不适合当前的需求或者数据库版本不支持该特性,则可以考虑使用其他方法实现类似的功能,比如利用 `UNION ALL` 结合多个 `GROUP BY` 查询来手动构造所需的汇总数据[^3]。 通过上述介绍,可以看到 `WITH ROLLUP` 是一种强大的工具,可以帮助快速生成复杂的分层汇总报表。不过,在实际应用过程中还需要根据具体业务需求灵活调整查询逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值