Oracle 结合rollup生成报表
2015-10-23 16:28
405 查看
领导一进来就将模板丢到面前,说5分钟之内给我弄数据出来,拿到的模板格式是这样的
看到报表的结构首先想到的是要将数据按照部门分组并按照月份做行转列操作。
至于“小计”嘛,大不了可以将前面12个月的列加起来总可以解决的。
最大的问题就在于“合计”的那一行,一开始想到的是使用group by + union all,先将各部门的数据统计成一个数据集,合计一行作为另一个数据集用group by统计起来,然后再用union all将两边的数据整合到一起。
这样做是可以做但是感觉不太方便,后来发现oracle中本来就提供了一个统计函数rollup来进行这样的统计的,下面将结合语句说明一下。
其实rollup说白了就是列的数据汇总,如果没有使用的话得出来的数据只是普通的分组数据集,如下图
加上了rollup之后数据集下面就会自动加上列的汇总统计行,也就是我们平常看到的合计一行,如下图
这样报表虽然出来了但是还是缺少了一些东西,再对比一下模板就会发现在dept一列最下应该要有“合计”两字,但是最底的那一行是rollup自动生成出来的要怎样将合计加上呢?在这个时候grouping函数就出来了。
grouping函数有两个返回1和0。若返回的是1则表示由于rollup函数所产生的空值对应的信息,返回0表示此行对应的这列参未与rollup函数分组汇总活动。下面是截取oracle官方文档的说法:
“Using a single column as its argument, GROUPING returns 1 when it
encounters a NULL value created by a ROLLUP or CUBE operation. That
is, if the NULL indicates the row is a subtotal,GROUPING returns a 1.
Any other type of value, including a stored NULL, returns a 0.”
因此在语句中使用case when + grouping函数对rollup字段进行修饰,若返回的是1则给它一个“合计”的中文,0则直接输出所以就出现了
这段东西,最后得出的结果是
看到报表的结构首先想到的是要将数据按照部门分组并按照月份做行转列操作。
至于“小计”嘛,大不了可以将前面12个月的列加起来总可以解决的。
最大的问题就在于“合计”的那一行,一开始想到的是使用group by + union all,先将各部门的数据统计成一个数据集,合计一行作为另一个数据集用group by统计起来,然后再用union all将两边的数据整合到一起。
这样做是可以做但是感觉不太方便,后来发现oracle中本来就提供了一个统计函数rollup来进行这样的统计的,下面将结合语句说明一下。
其实rollup说白了就是列的数据汇总,如果没有使用的话得出来的数据只是普通的分组数据集,如下图
加上了rollup之后数据集下面就会自动加上列的汇总统计行,也就是我们平常看到的合计一行,如下图
这样报表虽然出来了但是还是缺少了一些东西,再对比一下模板就会发现在dept一列最下应该要有“合计”两字,但是最底的那一行是rollup自动生成出来的要怎样将合计加上呢?在这个时候grouping函数就出来了。
grouping函数有两个返回1和0。若返回的是1则表示由于rollup函数所产生的空值对应的信息,返回0表示此行对应的这列参未与rollup函数分组汇总活动。下面是截取oracle官方文档的说法:
“Using a single column as its argument, GROUPING returns 1 when it
encounters a NULL value created by a ROLLUP or CUBE operation. That
is, if the NULL indicates the row is a subtotal,GROUPING returns a 1.
Any other type of value, including a stored NULL, returns a 0.”
因此在语句中使用case when + grouping函数对rollup字段进行修饰,若返回的是1则给它一个“合计”的中文,0则直接输出所以就出现了
这段东西,最后得出的结果是
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解