SQL学习(三) 轻松实现汇总小计(ROLLUP/CUBE)

前言

       我们在报表书写的时候,往往有需要作分类小计的情况,过去我们的技术人员常常是通过union all 来实现,结果导致报表中SQL语句繁杂,执行效率低不说,而且会为后期维护增加不必要的工作量。其实Oracle针对分类小计,提供了Rollup/Cube两种简单的表述方式,方便我们快速的进行统计分析。

ROLLUP/CUBE基本语法

       ROLLUP/CUBE的使用语法如下:

SELECT [column,] group_function(column). . .

FROM         table

[WHERE     condition]

[GROUP BY      [ROLLUP/CUBE]  group_by_expression]

[HAVING having_expression];

[ORDER BY       column];

       通过上面的描述,我们可以看到,要想使用ROLLUP/CUBE,必须具备以下几点:

       1.查询语句为分组函数(group function)查询。什么是分组函数呢?我们最常见的有:AVG, SUM, MAX, MIN, COUNT等都是分组函数。

       2. ROLLUP/CUBE的使用位置在GROUP BY 后面

       了解了语法,但是对其认识还不是很直观,我们下面就结合一些我们实际工作中问题,来展示下ROLLUP/CUBE的具体运用。

ROLLUP/CUBE的使用

       例如我们在日常工作中,常常有用户要求我们统计某段时间内病人的各种费用的金额汇总,如下:

注*为了方便显示,我这里对查询条件做了一定限制,只查询三个病人的费用信息

       现在我们想对每个病人做个小计,最后在汇总一个总合计,我们以前的方式是添加union all 的方式实现,如下:

       可以看出,上面的sql语句其实重复代码很多,如果基础查询比较复杂的话,会导致整个查询语句的代码量大大增加,而且sql执行的效率也不高,其实如果rollup可以轻松实现该功能,sql代码如下:

       这样,代码的复杂度就大大降低。如果用户还要求,除了统计出每个病人的小计,还需要统计每个收据费目的小计,rollup显然无法实现,这时,我们就要用到CUBE关键字了,sql代码如下:

grouping函数使用

       不过,从上面的例子中我们也看到一个问题,通过rollup/cube小计或者汇总的字段,该字段为空(null),如果我们汇总的字段本身也为空的情况下,显示就不太直观,无法区分,如下面的查询:

       如何区分小计和字段为空的情况呢?Oracle提供了grouping函数来区分这种情况,sql代码和结果如下:

         grouping函数返回的结果只有0和1,1就代表是汇总结果,0代表是原始结果,如上图,grouping(执行人)为1时,就表示这一行的执行人空(null)是由于汇总小计导致,而如果是0,表示,执行人字段本身就为空(null),这样我们就能清晰的分辨到底是小计汇总还是字段为空的情况。有了grouping函数,我们在制作报表的时候,就能够轻松的实现用户想要的汇总结果。

结语

       通过上面的介绍,我们只要合理的运用上面的技巧,就能够实现日常工作中大多数需要小计的报表。这样我们在以后的工作中,书写报表将大大的简化报表的sql代码同时也提高了sql的执行效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值