MySql中with rollup的使用

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 
  • 需要注意的点:
  1. MySql在用了with rollup之后,不可以使用order by进行排序。尽管在group by内可以指定列的顺序,但是由于with rollup增加的列仍然会插入相关列的后边。如果对排序有强需求,可以在外围包一层查询进行order by。
  2. 由于with rollup会使用NULL标记特殊的结果,所以如果被group by的列如果包含NULL值,那么最后的结果出来会令人困惑。比较好的办法是在使用with rollup之前先把表中的NULL值用某些不可能的常量替换。
  3. MySQL不支持with qube
  • 参考资料:
    https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值