前言:
用过excel的都知道,在表格里面对数据统计是很方便的,比如是对某一列求和,我们只需点击fx选择sum函数然后指定从哪一行/列到到一行/列即可。
但是在mysql里面在我们查出销售业绩后,领导突然想看下某一列的和?难道你就只能痴痴的复制到excel里面最求和运算吗?未免有点多此一举了吧?那你要这么整的话,估计领导会对你抛出不屑的眼神呵。
其实在mysql里面对这种聚合函数也是可以做到对列求和的。那就是今天要说的重点,关键字:ROLLUP。
正文:
前面引用了那么多的废话,这里开始进入主题:
rollup通常是要和group by一起使用的。做分组后的列求和运算。接下来我们具体说个例子,作为演示。
1.创建表:
表结构如图:
图中标红的地方等下我们要根据这个字段进行分组求和统计。
2.编写SQL
2.1不进行rollup看下结果:
SELECT
channel_type,
COUNT(*)
FROM
yx_sms_message
GROUP BY
channel_type;
2.2rollup看下结果:
SELECT
channel_type,
COUNT(*)
FROM
yx_sms_message
GROUP BY
channel_type WITH ROLLUP;
3.rollup后显示合计
细心地同学看到了,上面的虽然进行了求和,但是那一行却没有行头,
如何才能显示'合计'字眼呢,或许我们能够通过case when来实现。
SQL:
SELECT
CASE
WHEN channel_type = 'nusc' THEN
'用户中心_nusc'
WHEN channel_type = 'sms_app' THEN
'App_sms_app'
WHEN channel_type = 'sms_jichu' THEN
'基础平台sms_jichu'
WHEN channel_type = 'sms_wxxsxx_yxbd' THEN
'渠道sms_wxxsxx_yxcd'
WHEN channel_type = 'sms_wxxsxx_yxcd_q' THEN
'渠道sms_wxxsxx_yxcd_q'
ELSE
'合计'
END AS 业务类型,
SUM(sms_send_number) AS 合计条数,
COUNT(*) AS 合计记录数
FROM
yx_sms_message
WHERE
create_int_time >= 20190123
AND create_int_time <= 20190123
GROUP BY
channel_type WITH ROLLUP;
说明:
可能会有小伙伴有疑问,如果哪一个分组channel_type本身就是空,岂不是也显示合计了吗,如果有这情况的话,同学们可以再嵌套一层case when或则ifNull方法事先将null的替换成指定值,然后再在最外层进行case when... group by rollup即可。
注意这里的rollup,跟rollback没有一点关系,同学们不要望文生义,这个rollback是针对事务回滚用的,跟rollup是完全不同的两个关键字。