秒级展现的百万级大清单报表怎么做

简介:

《秒级展现的百万级大清单报表怎么做》中,我们介绍了无论 RDB 还是非 RDB,润乾报表都能够通过异步线程实现秒级海量大清单报表(以下简称:大报表)。实际业务中,除了查询明细,有时还要展现全量汇总数据,或者查询分组明细和计算分组汇总。本文就将介绍这些带有汇总和分组的大报表的开发方法。

带汇总的大报表
       在大报表中计算汇总值与常规报表基于报表内数据进行的汇总不同,大报表由于采用异步线程,因此无法通过报表内数据进行汇总(因为每次只能取到部分数据),只能在数据处理阶段计算汇总值并交给报表呈现。

我们还是使用《秒级展现的百万级大清单报表怎么做》中 SQL 源大报表的例子,现在需要在每页最后一行显示订单汇总情况(订单数量、订单总额、运费总额)。
1

制作报表模板
       增加一个数据集 ds2 计算汇总值:
2

报表中最后一行引入 ds2 汇总值进行呈现,这里为了每页都包含汇总数据,设置最后一行属性为报表尾。
3

当然,带有汇总的大报表性能跟计算汇总值的 SQL 执行效率强相关,所以可能会发现带有汇总的大报表要比单纯查询明细慢一些。

分组大报表
       实际业务中,简单呈现大报表清单往往还不够,有时还需要对海量数据进行分组,呈现汇总及明细情况。下面,我们就以订单数据为例,查询一下按地区分组的明细及订单金额汇总。

需求分析
       首先,需要呈现分组明细的报表无法在数据源端进行聚合,例如通过 SQL 聚合后就不包含分组明细了,除非再查询一次进行拼接,但查询两次显然会严重影响性能。因此我们需要尽量将明细数据读出后在应用端进行分组聚合。

    那问题就来了,由于海量数据要通过分批读取的方法进行呈现,如何保证读取的每批分组数据是完整的?如果分组数据不完整,分组聚合的结果显然也就不正确了。因此,除了要保证能在应用端实现聚合,还要保证批量读取数据时分组数据的完整性。

       下面就是润乾报表结合集算器(数据集)实现分组大报表的过程。

报表数据准备
       我们需要编写集算器 SPL 脚本进行数据准备。这里,我们要编写两个 SPL 脚本,分别实现:查询分组明细并计算汇总,以及通过游标分批为报表返回结果集。

SPL 脚本 1:group-detail.dfx
设置脚本参数:
4

编写 SPL 脚本:
5

SPL 解析:

1、 A2 查询数据库,SQL 中指定按照分组字段(货主地区)排序,以便后续可以每次取出整个分组进行汇总。为此需要在排序字段上建立索引,避免全表排序时间过长。

2、 A3 循环游标,以货主地区为标记,保证每次读取的记录数为一个地区数据

3、 B4 增加标志位,用于后续报表展现中突出汇总行。标志为 0 时表示是明细记录

4、 B5 针对每个分组进行汇总

5、 B6 将分组值追加到明细记录中,标志设为 1,表示是汇总记录

6、 B7 返回分组明细和汇总集合。注意这里 return 写在循环内,因此会多次返回分组集合

关于 for cs,n;x 用法
在集算器 SPL 脚本中,for cs,n;x 表示针对游标 cs 通过循环遍历数据,每轮从游标读取 n 条记录或者直到记录中的 x 发生变化,循环全部结束后关闭游标。大数据量的分组取数是这种循环的常用之处。如果省略了 n 和 x,那就简单地返回游标中所有数据并关闭游标。函数的具体说明可以参考:http://doc.raqsoft.com.cn/esproc/func/forcsnx.html

当大数据集按照分组字段有序时,这种取数方式每次可以读取一个完整分组到内存中参与计算,不过这时仍然要求分组不能很大(内存能装下)。而在金融和电信行业中,经常要基于单用户做数据分析,也就是按用户分组,而每个用户的流水记录规模又较大,常规的拆分方法作起来十分复杂。而通过集算器就可以很好地解决这类问题了。 
SPL 脚本 2:main.dfx
设置脚本参数:
6

编写 SPL 脚本:
7

   前一个 SPL 脚本 group-detail.dfx 解决了分组查询明细并汇总计算的问题。这个脚本 main.dfx 则可以分批次取数并提供给润乾报表,从而实现异步大报表呈现。脚本中 A1 通过 cursor 函数直接调用前一脚本生成游标,由 A2 将游标返回给报表。

关于 cursor() 函数
       使用 cursor 函数调用 SPL 脚本生成游标时,被调用的 SPL 脚本可以有多个返回结果集(例如在 for 循环中的多个 return),而游标取数(fetch)时可以依次使用多个 return 结果,无需等待所有结果集都准备好再使用,原理如下图所示。函数的具体说明可以参考:http://doc.raqsoft.com.cn/esproc/func/cursordfx.html
8

结合大报表使用 cursor() 函数运行原理

设计报表模板
设置报表参数,查询起止日期:
9

设置数据集引用 main.dfx 并传递日期参数:
10

       按照大报表模板设计思路,编写表达式
11

为了将汇总行高亮显示出来,这里利用了数据准备阶段增加的标志位 flag 列,当 flag 值为 1 的时候代表该行为汇总行,设置背景色表达式:if(A3==1,-3355444)

设置大数据集
12

发布到 WEB
       将做好的模板发布到 WEB 端,效果如下:
13

当然,标志位 flag 列也可以设置为隐藏。

效果调整
       调整报表模板,将标志位 flag 列隐藏,并设置 B3 格的扩展属性 同值合并为“纵向合并”
14

展现时分组列则带有合并格的效果:
15

注意事项
       在《秒级展现的百万级大清单报表怎么做》中,我们提示了大报表不要全表排序,也不适合高并发场景。除此以外,对于带有分组汇总和明细的大报表还应该注意:

单个分组不宜过大
       由于计算分组明细和汇总值时需要将某一个分组数据全部加载到内存中进行计算,因此分组相对内存容量不宜过大,从而确保单个分组数据能进行全内存计算。

作者:lisongbo
链接:http://c.raqsoft.com.cn/article/1536328795758
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
7月前
|
easyexcel Java Maven
百万数据excel导出功能怎么做
百万数据excel导出功能怎么做
235 0
|
5月前
|
数据采集 SQL 数据可视化
79 网站点击流数据分析案例(整体技术流程及架构)
79 网站点击流数据分析案例(整体技术流程及架构)
56 0
|
9月前
|
监控 BI 定位技术
直播程序源码开发建设:洞察全局,数据统计与分析功能
数据统计与分析功能不管是对直播程序源码平台的主播或运营者都会有极大的帮助,是了解观众需求、优化用户体验成为直播平台发展的关键功能,这也是开发搭建直播程序源码平台的必备功能之一。
直播程序源码开发建设:洞察全局,数据统计与分析功能
|
SQL 消息中间件 Java
百万级数据excel导出功能如何实现?
这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助。 原始需求:用户在UI界面上点击全部导出按钮,就能导出所有商品数据。
540 0
百万级数据excel导出功能如何实现?
|
SQL 监控 数据库
网站流量日志分析—数据入库—宽表具体表现1—时间拓宽|学习笔记
快速学习网站流量日志分析—数据入库—宽表具体表现1—时间拓宽
185 0
网站流量日志分析—数据入库—宽表具体表现1—时间拓宽|学习笔记
|
BI 流计算
固定报表业务
固定报表业务
|
SQL 算法 Java
百万级别数据Excel导出优化
这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。
751 0
百万级别数据Excel导出优化
|
存储 分布式计算 数据挖掘
百亿级日志流分析实践 | 剖析个推后效分析功能实现原理
“码”上注册和登录个推开发者中心(https://dev.getui.com/),体验个推后效分析功能和最新推出的消息链路查询功能吧!
164 0
百亿级日志流分析实践 | 剖析个推后效分析功能实现原理
|
BI 关系型数据库 数据库
银行业大数据量清单报表案例
银行数据查询业务中,经常会碰到数据量很大的清单报表。由于用户输入的查询条件可能很宽泛,因此会从数据库中查出几百上千万甚至过亿行的记录,比如银行流水记录;为了避免内存溢出,一般都会使用关系型数据库的分页机制来做,但结果往往也不尽人意;有些情况下甚至底层采用了非关系型数据库,这更会加剧了问题的复杂度。
1210 0
|
存储 SQL 关系型数据库