用润乾报表解决多层指标体系实时报表计算问题
问题描述:
这是农业银行某项目应用的实际场景,该财务项目使用多层次的指标体系进行日常指标分析,
为后面简单理解报表实现思路,先把指标体系进行抽象:
典型指标分析报表如下面图示(需要制作的报表):
参数录入界面
报表界面
解决思路:
第一个办法-最简单思路,数据异步计算
数据库中增加存储指标中间数据的表,增加定期数据计算抽取任务,报表取数时直接从上述中间表中取数,这样做的好处是报表开发工作简单,报表计算速度快,缺点是如果指标要经常调整,整个数据库和报表开发维护的工作会让人无法承受。
第二个思路-即时报表计算,每次都分解指标结构来实时计算数据。
报表设计层面把指标分解成可直接取数的字段公式(基础指标),分解后的公式通过润乾报表的宏把多个指标转成sql取数对象里的中间字段,由于每次查询的指标数量不确定,所以报表上要通过动态列技术按照客户提出的需求对数据进行组织。该问题在数据仓库的星形结构中比较典型,例如现在的客户为方便cognos模型定义和提高取数效率,事实表会变成:
日期 |
机构 |
币种 |
基础指标1 |
基础指标2 |
基础指标3 |
基础指标4 |
基础指标….. |
而在设计报表时,更好用的数据表格式应该是:
日期 |
机构 |
币种 |
指标名称 |
指标值 |
基础指标1 |
||||
基础指标2 |
||||
基础指标3 |
||||
基础指标4 |
||||
基础指标5 |
上表中的数据用报表设计工具来做,不论是交叉表还是分组等报表,做起来都是最舒服的模式。
该问题的通用描述是:上一种格式称作”宽表”,下面的格式称作”窄表”,宽表是出于提高OLAP建模的方便和效率目的设计的,所以在数据层面的初步处理是先从窄表转为宽表,在宽表成为数据基础之后,才出现综合查询方面的固定报表格式设计问题,简单的报表工具在使用窄表制表时没有问题,但是对付宽表时就出现极大的困难,有关基于宽表报表的实现办法,准备在另外的文章中介绍,本文只介绍多层级指标实时分解的思路。
第二个思路的好处是可以应对任何的指标公式变化,缺点是在数据量大的时候,报表的取数和计算应该会慢一些。
实际应用:
下面介绍第二中思路在例子使用时的实现思路,用户首先会输入报表需要的参数,如下面表单中的参数内容:
这里重点关注指标,由于指标的层次体系已经建立,所以在指标选定时可以任意指定不同层次的指标,例如:可以写作
指标一,指标D,指标D-指标B
按照前文介绍的指标体系,”指标一”是二级衍生指标,”指标D“是一级衍生指标,而”指标D-指标B“完全是自定义的临时指标定义表达式。
在这样的指标提交时,报表接收之前会在程序中对指标进行翻译,例如上述的指标一会被翻译成数据结构层面的表和字段表达式:
指标A +指标B+指标C
所以上述表单中输入的指标参数会被报表上的字符串数组接收
[指标A +指标B+指标C , 指标D , 指标D-指标B]
而上述的字符串数组可以通过润乾的宏工具直接转成数据集动态sql的一部分,这样就可以在sql执行时动态算出指标数据。
总结:上述工作的关键在于表单提交时对指标参数的翻译处理,这里不考虑中间数据处理,不考虑报表之间的数据调用,而是直接按照指标的层级定义,将指标参数映射成最基础的字段表达式,而这个表达式通过润乾宏可以直接成为取数sql的一部分。在客户的需求实现过程中证明这个思路是可行的,具有良好的实用性。
关于例子中基于宽表的报表实现内容,请参见《基于数据仓库中宽表结构的报表设计技巧》