MYSQL中自动加一行汇总

背景

  每天一早到公司,第一件事就是打开各种报表,查看平台运行情况。到了周末,睡完懒觉还是得爬起床远程回公司看报表数据。于是在周末的时候,将娃哄睡之后,开始着手写一下统计sql,定期执行后将结果汇总推送到企业微信。

  问题就出现在“汇总”这个事。众所周知 sql的group by 能做分组统计,但是分组后还得再执行一次sql将结果汇总一遍,才能将分组统计结果加起来。如下面的SQL:

select status as '状态' , count(1) as '任务数'
from action_history
where create_time >= '2022-04-17' and create_time<'2022-04-18'
group by status

  执行结果两列,一列是任务执行状态,第二列的任务执行次数。任务共有5种状态,如果想将这5种状态对应的次数都起来的话,口算不好的我有点难度。这时,可以再执行一个count(1)的sql,查出所有记录数进行汇总。但是这种方式需要执行两次sql,太不优雅了。

  想着这实在太麻烦了,而且这是个常用的场景,数据库大神们肯定不会按捺得住不将这场景覆盖到的。于是一个个mysql函数地找,终于找到了个宝藏涵数,完美解决了汇总的需求。

COALESCE函数

  这个宝藏涵数就是COALESCE了,只要对上面的sql稍微修改一下,就能在之前的sql执行结果里自动加一行汇总,简直不要太好用了。修改后的SQL如下:

select COALESCE(status, '汇总') as '状态',count(1) as '任务数'
from action_history
where create_time >= '2022-04-17' and create_time<'2022-04-18'
group by status WITH ROLLUP

  将 select 里的 status 改为 coalesce(status, '汇总'),在 group by status后面加上 with rollup,即可实现我要的汇总效果:

with rollup

  有经验的童鞋应该发现,实际上起作用的,不是coalesce函数,而是group by后面的 with rollup配置。coalesce函数的作用,其实是返回第一个非空的值。如不加这个涵数,新加的汇总那一行,“汇总”两字会被设置为“NULL”,为了好看,使用coalesce将“NULL”替换为“汇总”。魔法到此结束。

额外的坑

  使用with rollup进行汇总统计时,对于count、sum等这些统计函数的确好用,但是如果count(distinct xxx)这样用的话,汇总的结果会不准。

参考资料

MYSQL函数

MYSQL分组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值