WITH ROLLUP
使用with rollup,可以在group by的时候额外返回分组信息,避免多次查询统计,如:
CREATE TABLE sales
(
year INT,
country VARCHAR(20),
product VARCHAR(32),
profit INT
);
SELECT year, country, product, SUM(profit) AS profit
FROM sales
GROUP BY year ASC, country ASC, product ASC WITH ROLLUP;
将会的到结果:
结果解读:GROUP BY year, country, product WITH ROLLUP,相当于在(year, country, product)、(year, country)、(year)、() 四个维度上聚合信息并一次返回,上述查询语句除了返回结果的顺序外,与下边的语句等价,但是避免了多次查询记录:
SELECT year, country, product, SUM(profit) AS profit
FROM sales
GROUP BY year ASC, country ASC, product ASC
union
SELECT year, country,NULL, SUM(profit) AS profit
FROM sales
GROUP BY year ASC, country ASC
union
SELECT year,NULL,NULL, SUM(profit) AS profit
FROM sales
GROUP BY year ASC
union
SELECT NULL,NULL,NULL, SUM(profit) AS profit
FROM sales
- 需要注意的点:
- MySql在用了with rollup之后,不可以使用order by进行排序。尽管在group by内可以指定列的顺序,但是由于with rollup增加的列仍然会插入相关列的后边。如果对排序有强需求,可以在外围包一层查询进行order by。
- 由于with rollup会使用NULL标记特殊的结果,所以如果被group by的列如果包含NULL值,那么最后的结果出来会令人困惑。比较好的办法是在使用with rollup之前先把表中的NULL值用某些不可能的常量替换。
- MySQL不支持with qube
- 参考资料:
https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html