ROLLUP

rollup相对于简单的分组合计增加了小计和合计(适用于统计功能),解释起来会比较抽象,下面我们来看看具体事例。

1.统计不同部门工资的总和和所有部门工资的总和。

select deptno,sum(sal) from emp group by deptno with rollup;

2.先对deptno进行分组,再对job进行分组

select deptno,job,sum(sal) from emp group by deptno,job with rollup;

这里可能就有人会有疑问了,为什么数据比原来多了10条,理论上应该只是全部的总结,只会比group by 多一条数据才合理,查了资料才弄明白,对于聚合单数据(group by 后面的变量一个为单数据,多个则为多数据)是适合的,但是在多数据的情况下就不一样了,下面我们分析一下,首先会根据depno变量,将原始数据分为9个101,102,103...109九个组,group by WITH ROLLUP会在每个分组后面加上本组类的信息(deptno),第5行数据就是1,2,3,4行数据聚合所执行sum(sal)所得的结果,依次类推...108,109也是一样,同时在最后,会将全部的分组聚合。

性能分析:

3.对比不使用 rollup实现类似功能(可用UNION ALL语句)

#实现单个部门,单个工种的工资的总和select deptno,job,sum(sal) from emp group bydeptno,jobunion all#实现单个部门工资的总和select deptno,null,sum(sal) from emp group bydeptnounion all#实现所有部门工资的总和select null,null,sum(sal) fromemporder by deptno desc,job desc

性能分析:

总结:

通过2,3执行结果的性能分析:不难看出,相同的功能实现,ROLLUP相对于UNION ALL效率有了极大的提升。

实战案例:

#emp 表结构CREATE TABLE`emp` (

`id`int(10) unsigned NOT NULLAUTO_INCREMENT,

`empno` mediumint(8) unsigned NOT NULL DEFAULT '0',

`ename`varchar(20) NOT NULL DEFAULT '',

`job`varchar(9) NOT NULL DEFAULT '',

`mgr` mediumint(8) unsigned NOT NULL DEFAULT '0',

`hiredate` dateNOT NULL,

`sal`decimal(7,2) NOT NULL,

`comm`decimal(7,2) NOT NULL,

`deptno` mediumint(8) unsigned NOT NULL DEFAULT '0',PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=500001 DEFAULT CHARSET=utf8;

1.对员工表的信息按照部门,汇总岗位信息的薪资情况。

#常规处理select deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group by deptno

2.如果相对上结果,加上一个汇总展示,如何处理?

#1.使用 union all

select deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group bydeptnounion all

select null ,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfromemp

#2.使用 rollupselect deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group by deptno with rollup;

存在问题:

1. 这个记录没有出现总计两个字,怎么实现呢? 使用 ifnull()函数 (有坑)

#有坑版select ifnull(deptno,'汇总') deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group by deptno withrollup;

#为什么说有坑? 如果deptno 本身为null ,那么以上查询将会出现多个汇总行。

#填坑版 (使用双层ifnull判断or 将字段定义为not null)select ifnull(deptno,'汇总') deptno,dev_sal,manager_sal,salesman_sal,Test_sal from(select ifnull(deptno,'空城(默认)') deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group by deptno ) a group by deptno with rollup;

2.如果想对其中一列进行排序如何处理?使用order by field()处理

#天真的处理方式select ifnull(deptno,'空城(默认)') deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_salfrom emp group by deptno with rollup ORDER BYTest_sal ;

#结果报错: Incorrect usageof CUBE/ROLLUP and ORDER BY#原因:MySQL 虽然提供了group by with rollup 函数进行group by 字段的汇总,but 与 order by互斥,不能同时用

#正确方式 使用orderbyfield()

#根据测试岗位的Test_sal薪资降序排列 总计置于底部=>可以把上面代码当成一个子表嵌套 结合 order byfield()自定义函数实现select *from(select ifnull(deptno,'总计') deptno,dev_sal,manager_sal,salesman_sal,Test_sal from(select ifnull(deptno,'空城(默认)') deptno,sum(if(job = 'dev',sal,null)) dev_sal,sum(if(job = 'manager',sal,null)) manager_sal,sum(if(job = 'salesman',sal,null)) salesman_sal,sum(if(job = 'Test',sal,null)) Test_sal from emp group bydeptno

)agroup by deptno withrollup

) bORDER BY FIELD(b.deptno,'总计'),b.Test_sal DESC;

rollup mysql_mysql - rollup 使用相关推荐

  1. Rollup(1): 安装 Rollup 以及 Rollup 和 Webpack 的区别

    Rollup 介绍 Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序.Rollup 对代码模块使用新的标准化格式,这些标准都 ...

  2. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

  3. Vue 是如何用 Rollup 打包的?

    大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  4. group by rollup

    首先引用ITPUB上的总结: rollup(a,b,c)----------------> 从右到底递减汇总 ====>group by a,b,c   (减0次) UNION ALL = ...

  5. rollup函数_Vue3同款打包工具Rollup常用配置

    Rollup的优势 在最新的Vue3版本中,也使用了rollup作为打包工具.相比于webpack,rollup要轻量许多,用于弥补gulp的无tree-shaking是很好的选择,最大的用途是打包生 ...

  6. 如何使用rollup打包前端组件/库

    如何使用rollup打包前端组件/库 目前主流的前端框架vue和react都采用rollup来打包,为了探索rollup的奥妙,接下来就让我们一步步来探索,并基于rollup搭建一个库打包脚手架,来发 ...

  7. 使用模块化工具Rollup打包自己开发的JS库

    使用模块化工具Rollup打包自己开发的JS库 打包JS库demo项目地址:https://github.com/Miazzy/xdata-utils-btools 背景 最近有个需求,需要为小程序写 ...

  8. StarkWare推出ZK Rollup扩容解决方案StarkNet

    1月27日消息,零知识证明研发机构StarkWare表示,其二层扩容解决方案ZK Rollup"StarkNet"目前已经完成基础构建(阶段0),即图灵完备框架Cairo.STAR ...

  9. rollup配置及使用

    前言 业务线长期的积累产生了许许多多重复性的工具方法,业务功能模块等, 我们正好可以用 rollup 构建一个 npm 私服工具包,便于后期业务使用,减少重复性的代码编写. 项目配置 babel 引入 ...

最新文章

  1. jsp与java的关系_jsp教程中:jsp与servlet的区别和关系
  2. 转载CSDN - 从程序员到HR——面试经验分享
  3. Nginx + Tomcat 负载均衡集群配置
  4. android:showAsAction=never报错
  5. RSAC简介 RSAC 2020 最热门的36款网络安全产品
  6. Build desktop apps for Windows PCs
  7. bzoj4033: [HAOI2015]树上染色(树形dp)
  8. Nginx根据User-Agent适配PC和手机
  9. python 日期操作【转】
  10. linux 启动作业,[转载] 随身带着走的作业系统 ~安装Linux作业系统于随身碟~
  11. 推荐算法(一)电影推荐系统
  12. GB35114---认证报告
  13. Flash Builder 4 破解
  14. 用C语言实现C++ 继承与多态
  15. 计算机硬件的五大组成部分
  16. PyTorch实例:用ResNet进行交通标志分类
  17. android-实现一个简单的视频弹幕
  18. Liunx 安装redis
  19. nand flash基础——基本结构
  20. 网站不加“www”无法访问怎么解决?

热门文章

  1. mac下直接运行python脚本
  2. 用于快速Web开发的5大Python Web框架
  3. Window常用快捷键——Alt组合键
  4. async/await的基础用法
  5. Linux修改root密码(简单实用)
  6. 查看MySql版本号命令
  7. 解决移动端浏览器 HTML 音频不能自动播放的三种方法
  8. 那些让你敬佩万分奉若圭臬的话,你认为有哪些?
  9. 西工大NOJ数据结构理论——010.k阶斐波那契数列(严3.32)
  10. [附源码]计算机毕业设计Python+uniapp家庭理财产品小程序10341(程序+lw+远程部署)