MySQL-Mysql GROUP BY col WITH ROLLUP 的使用?

意见反馈 意见反馈 主题:991 回复:2082

MySQL-Mysql GROUP BY col WITH ROLLUP 的使用?

泛泛之交 发布于 2017-09-07 字数 775 浏览 1211 回复 2

手册 GROUP BY 分组部分时 看见了 WITH ROLLUP 的用法;
手册说明:在查询结果中自动添加一行关于统计和的记录,这组的名字为 NULL。
例如:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
+------+-------------+
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 | 4525 |
| 2001 | 3010 |
| NULL | 7535 |
+------+-------------+

之前没有这么用过,有过经验的同学给讲讲使用这个来做分组统计有什么需要注意或是优化的地方吗?还有就是速度怎么样?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(2

晚风撩人 2017-10-13 2 楼

with rollup可组内聚合
使用时注意:
1、当使用ROLLUP时,不能同时使用ORDER BY 子句进行结果排序。即,ROLLUP和ORDER BY 是互斥的。
2、limit用在ROLLUP后面

清晨说ぺ晚安 2017-10-06 1 楼

WITH ROLLUP称之为:上滚统计
它可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息 。
使用有 WITH ROLLUP 子句的 GROUP BY 语句时,不能再使用 ORDER BY 语句对结果集进行排序,如果对返回的结果顺序不满意,需要应用程序获得结果后在程序中进行排序.

select * from employee;
+------+--------+------+------+------+
| id | name | dep | pos | sal |
+------+--------+------+------+------+
| 1 | abcd | 01 | 01 | 1000 |
| 2 | eefs | 01 | 02 | 2000 |
| 3 | micro | 02 | 01 | 1500 |
| 4 | cathey | 02 | 02 | 3000 |
| 5 | amy | 03 | 01 | 2500 |
| 6 | lily | 03 | 02 | 2200 |
| 7 | bobo | 01 | 01 | 2000 |
| 8 | gray | 01 | 02 | 1900 |
| 9 | leon | 03 | 02 | 2900 |
| 10 | sun | 02 | 02 | 1900 |
+------+--------+------+------+------+

计算每个部门,每个职位的工资平均值:

select dep,pos,avg(sal) from employee group by dep,pos;
+------+------+-----------+
| dep | pos | avg(sal) |
+------+------+-----------+
| 01 | 01 | 1500.0000 |
| 01 | 02 | 1950.0000 |
| 02 | 01 | 1500.0000 |
| 02 | 02 | 2450.0000 |
| 03 | 01 | 2500.0000 |
| 03 | 02 | 2550.0000 |
+------+------+-----------+

如果我们希望再显示部门的平均值和全部雇员的平均值,如果不用WITH ROLLUP 子句,普通的 GROUP BY 语句是不能实现的,需要另外执行一个查询操作,或者通过程序来计算。

 select dep,pos,avg(sal) from employee group by dep,pos with rollup;
+------+------+-----------+
| dep | pos | avg(sal) |
+------+------+-----------+
| 01 | 01 | 1500.0000 |
| 01 | 02 | 1950.0000 |
| 01 | NULL | 1725.0000 |
| 02 | 01 | 1500.0000 |
| 02 | 02 | 2450.0000 |
| 02 | NULL | 2133.3333 |
| 03 | 01 | 2500.0000 |
| 03 | 02 | 2550.0000 |
| 03 | NULL | 2533.3333 |
| NULL | NULL | 2090.0000 |
+------+------+-----------+

参考:使用 GROUP BY WITH ROLLUP 改善统计性能