设为首页 加入收藏

TOP

简化报表数据源的复杂集合运算
2015-07-24 10:44:13 来源: 作者: 【 】 浏览:1
Tags:简化 报表 数据源 复杂 集合 运算

报表数据源计算中经常会使用到集合运算,SQL对集合运算的支持使得大部分简单的集合运算都能轻松完成。但是,当集合运算比较复杂,需要使用存储过程完成时,由于存储过程对集合运算的支持不够,也无法使用中间结果导致这类运算实现起来非常困难。

一个比较典型的复杂集合运算问题,这类计算往往都是为前台报表服务的,使用SQL和存储过程都很难完成。而一般的报表工具由于不具备强计算能力,对于这类计算更加无法完成。

使用润乾集算报表来做则比较简单,这里以上述链接中的实际业务为例,给出集算报表的实现方案。

报表背景

源数据如下:

\

?

现需要在报表中统计不同id下不同时间段内不重复的天数,如:

\

?

这个报表的难点在于用SQL或存储过程写起来很困难,而一般报表工具则不具备数据源计算能力,根本无法实现。

集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。

编写集算脚本

首先使用集算脚本编辑器,新建集算脚本,设置脚本参数,如ID范围。

\

?

编写脚本完成数据计算,为报表输出计算后结果集:

\

?

A1:连接数据源;

A2:根据id起止范围,执行sql取数;

A3:根据日期范围字段,增加起始日期和终止日期字段;需要说明的是,类似的字符串拆分工作也可以用SQL完成,但SQL的串拆分功能不是很方便,所以这里也给出集算脚本的实现方式,用户使用时可以选择;

A4:先按id分组,将每个id下所有日期段内日期合并(重复的只显示一个),然后计数,得到不重复天数;其原理是将这些时间段转换成日期的集合(period函数),再将这些集合求并集(union),这时就会将重复的去除,最后只要数集合的成员个数即可(len)。

\

?

如果不重复天数是指只计算出现过一次的日期,即重叠的日期都不计数,那么通过集算脚本也很容易实现,通过下面的代码即可完成:

A3.group(id;~.conj(periods(起始日期,终止日期,1)).group().count(~.len()==1):不重复天数)

其原理是按照日期分组后,统计每个分组子集成员数为1的子集数量,也就是只出现过一次的日期。

A5:为报表返回结果集

编辑报表模板

使用集算报表编辑器,编辑报表模板,用于数据展现。首先新建参数,并设置默认值。

\

?

新建报表并设置集算器数据集,调用上述编辑好的脚本文件。

\

?

其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的;参数b_id和e_id为报表模板参数,begin和end为脚本参数,事实上二者可以同名。

?

编辑报表表达式,直接使用集算脚本返回的结果集,完成报表制作 。

\

?

报表展现结果如下:

\

?

可以看到,使用集算器脚本可以快速完为报表准备数据。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。

在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。本例使用脚本数据集可以这样完成:

1. 在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;

2. 在弹出的脚本数据集编辑窗口中编写脚本;

\

?

这里可以看到,在脚本数据集中直接使用了报表中定义好参数b_id和e_id,比起单独的集算脚本更加简单、直接。

3.报表模板和表达式与使用集算器数据集方式一致,不再赘述。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇每隔一段时间,hbase的读就会停顿.. 下一篇atitit.自动生成数据库结构脚本,..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)