集算器如何优化复杂报表计算(2)格式布局及过程计算

布局格式

横向分栏

大多数报表工具都支持纵向分栏,但几乎没有报表工具支持横向分栏,我们可以用集算器把数据集事先摆好。


A


B


C


1


=db.query("select a,b,c from T ")


2


=A1.step(3,1)


=A1.step(3,2)|[null]


=A1.step(3,3)|[null]


3


=A2.derive(B2(#).a:a2,B2(#).b:b2,B2(#).c:c2,C2(#).a:a3,C2(#).b:b3,C2(#).c:c3)

这段代码将3列结果集(a,b,c)横向拼接成9列结果集(a,b,c,a2,b2,c3,a3,b3,c3),行数是原来的1/3,报表工具按普通报表方案处理即可实现横向3栏的效果。

补齐空行

报表在打印时要将每页充满,最后一页如果行数不足满页需要补足空行,而许多报表工具本身未提供这个功能。用SQL在数据集上补足这些行并不容易,用集算器很简单。


A


1


=db.query("select * from T")


2


=pn-A1.len()%pn


计算应补的行数


3


=A1|if(A2!=pn,A2*[null])


补充空行数后的结果集

将每页显示的行数pn作为参数传递进来。

交叉表列运算

如下的报表,统计某年(作为参数)及其去年的产品销售额和增长率


产品


2014


2015


2015增长率


空调


100


120


20%


电视


200


210


5%





数据结构简化为 产品、年度、金额。

这看起来象个交叉表,但最后一列的增长率涉及到列间运算,而一般报表工具对交叉表只提供列间的统计式计算(如求和、平均等)。如果不用交叉表则需要事先将数据做转置,而且又会涉及许多报表工具不支持的动态列名功能。

如果用集算器将增长率计算出来后补入原始数据,就可以用常规交叉表实现了。


A


B


1


=db.query("select 产品,年度,金额 from T where 年度=?-1 or 年度=? order by 产品,年度",Y,Y)


Y为参数年度


2


for A1.group(产品)


>A1.insert(0,A2.产品, string(Y)+"增长率", string(A2(2).金额/A2(1).金额-1,”#%”) )


计算增长率后插入


3


return A1

过程计算

避免隐藏

列出销售额占了前一半的大客户名单和金额以及这些客户的数量和平均销售额,数据结构简化为客户、金额。

这个运算有明显的步骤,先按金额将客户排序,同时计算出金额合计,然后在客户列表中计算累计金额,达到一半总额时其它的记录将被过滤掉。

在报表工具中很难直接实现这个步骤。报表是状态式计算,即把所有表达式填入后,由报表工具自动识别依赖关系后决定计算次序,要人为控制计算次序,就要设计合理的单元格引用关联,其中的中间结果还需要用隐藏格实现。

以润乾报表为例的实现方法:

ds=select 客户,金额 from 客户销售 order by 金额 desc


A


B


C


1


客户


金额


=ds.sum(金额)/2


2


=ds.select(客户)


=ds.金额


=C2[-1]+B2


3


大客户数量


=count(B2{C2[-1]<C1})


4


平均销售额


=avg(B2{C2[-1]<C1})

C列要隐藏,并且在第2行设置显示条件为C2[-1]<C1。和表中的表达式类似,这里都要使用C2[-1]<C1来处理刚好跨过一半销售额的那一行,而不能用更简单的C2<=C1。

从报表设计中可以看到,这个条件会被重复计算多次。而且,被隐藏的小金额条目要比大金额条目更多,造成内存空间没必要的浪费。虽然报表可以做出来,但编写理解难度较高,并且运算效率很差。

另外,这个报表用到了跨行运算和格集条件过滤以及按条件隐藏行等功能,润乾报表对这些复杂的计算有着良好的支持,但并非所有报表工具都是这样,采用计算能力较弱的报表工具,这个报表就很难直接开发出来了。

如果采用集算器先准备出数据源再做报表,整体过程就清晰很多。


A


B


1


=db.query(“select 客户,金额 from 客户销售 order by 金额 desc”)


2


=A1.sum(金额)/2


=0


3


=A1.pselect((B1+=金额)>=A2)


return A1.to(A3)

在集算器脚本中实现前述的步骤,虽然代码也有几行,但完全按自然思路,很容易理解和编写。脚本只返回符合条件的大客户,拿到这个数据集,使用普通报表工具都可以采用常规方案简单实现了。

过程计算

有些涉及到单元格位置改变的过程性计算,即使愿意付过编写困难和运算效率的代价,也难以用隐藏格实现。

比如将分组后按汇总值排序,这不算很罕见的需求,但许多报表工具无法直接实现。报表的排序功能大都设计在分组之前(因为更常见),没有分组后的排序。使用集算器脚本就很简单,代码具有足够的灵活性,可以描述各种计算次序的要求。


A


1


=db.query(“select …”)


取出数据


2


=A1.group(G).sort(~.sum(A))


按G分组再按A的合计排序


3


=A2.conj()


合并成单层集合返回

这个脚本返回的结果集已经按分组汇总值排过序,报表工具拿到数据后只要简单再分组重新计算汇总值就可以了。

类似地,如果上小节例子中我们希望那些大客户按名称排序而非销售额,使用报表工具几乎就无法完成了。而使用集算器只要把B3格表达式改成A1.to(A3).sort(客户)。

时间: 2024-10-07 07:32:29

集算器如何优化复杂报表计算(2)格式布局及过程计算的相关文章

集算器替代存储过程实现报表数据源

存储过程是SQL语句和流程控制语句的集合,常用来把一个复杂的计算目标分解为多个简单的计算步骤.虽然以复杂性换来了灵活性,但SQL语句固有的缺点仍然体现在存储过程中,比如:分步不彻底.数据无序.缺乏集合.缺乏引用,之前我们也分析过存储过程作为报表数据源的利弊,可点击这里查看. 集算器解决了存储过程的上述缺陷,降低了对开发人员的技术要求,是存储过程理想的替代工具. 报表例子说明 某电信产品厂商有一张报表,主要目的是分析优势产品的销售额.销量.环比等指标,其中优势产品的定义是"在每个州的销量均在前10

集算器如何优化SQL计算(3)序运算

跨行引用 早期SQL不直接支持跨行引用,要生成序号后再JOIN,极其繁琐困难.引入窗口函数后的SQL能够较方便地引用其它行数据,但写法仍不简洁,有多个跨行引用项时代码会很长.而且如前所述,窗口函数在其它运算结果集基础上再实施,对窗口函数计算值的再引用就要写成子查询的形式,仍然繁琐. MySQL不支持窗口函数,但支持在SQL中使用变量,可以引用到前面的行,但无法引用到后面的行. 集算器提供了方便自然的跨行引用语法. 各产品月销售表结构为:产品.月份.销量:现要找出销量比上月多10%的记录. A 1

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

用集算器实现报表的外置存储过程数据源效果

业务逻辑相对复杂的报表开发中,开发人员往往会使用存储过程为报表准备数据.而使用存储过程往往受到编写困难.执行效率低下.数据库操作权限限制等问题,着实让开发人员不爽.如何改进或替代存储过程,成了很多程序员的心心声. 本文通过一个例子说明如何使用集算器实现报表存储过程数据源效果. 报表样式 某网络平台需要监测查看一定周期内的用户状况,需要为运营部门出具日报.周报.月报.年报等报表,每类报表中均包含本期与上期.上上期数据比较,故涉及数据量较大.这里以其日报为例(月报年报只是统计周期不同),报表格式如下

用集算器实现跨行组计算报表

跨行组计算类报表在报表开发中非常常见,如常见的同期比.环比计算.移动平均值计算等.这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表工具在实现时并不轻松.功能相对强大的润乾报表需要借助层次坐标和位移坐标,辅以条件表达式和"$"运算符完成,书写和理解都有相当的难度. 其实通过集算器这类报表则非常容易实现,我们来看一个例子.     报表需求:根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比,样式如下: 这里应该注意的是比去年同期是指

报表工具的二次革命之集算器的作用

之前的文章已经大致给大家介绍过大数据计算引擎-润乾集算器了.想必很多人心里还是存在疑惑,集算器作为大数据分析系统,到底它能做些什么?这篇文章,就为大家详细介绍. 降低报表开发难度 降低开发难度从而提高开发效率是集算器的设计初衷,是最容易理解的作用,前面已有粗略介绍. 这方面的细节内容太多,我们会再做一个专门话题详细讲述集算器如何解决报表开发中的各种具体难题以及与常规手段的对比.在这里只做总结性地阐述. 比Java和SQL更易写 如前所述,集算器的设计目标是为了解决报表的数据准备,而目前这个工作一

集算器简化SQL式计算之组内运算

在开发数据库应用时,经常会遇到分组后针对组内数据的运算问题,如:列出近3年每年都发表过论文的学生名单,统计全部参加了历次培训的员工,选出每位客户的高尔夫成绩最高的三天等等.SQL完成这类运算较为复杂,一般需要嵌套多层,导致代码难以理解和维护.而集算器擅长表达这类组内计算,且很容易和JAVA或报表工具集成.下面用一个例子来说明. 根据数据库表SaleData统计出2013年中,每个月销售金额均排在前20名的客户名称.SalesData的部分数据如下: 想解决这个问题,需要选出2013年的销售数据,

用集算器实现跨数据库关联报表

实际应用中很多报表的数据来源于多个不同类型的数据库,报表数据源跨数据库是报表开发中的常态.目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题. 使用报表工具自身多源关联功能 现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利.然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定).这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长. 即使有的能实现,在报表中做跨库关联计算的效率也较低,

润乾集算报表的集算器数据集部署(I)

润乾集算报表提供了集算器数据集,允许用户使用集算器脚本完成数据的进一步计算和加工,为报表提供数据源支持,从而简化报表开发,提升报表性能. 集算器脚本的编辑需要借助第三方集算编辑器(非报表工具)完成,而后嵌入到报表工具和报表应用中完成报表开发和部署. 下面来看一下集算器数据集的使用和以及报表部署过程. 1.开发环境使用 集算报表使用集算器数据集时,首先需要设置集算器授权信息和配置数据源连接(如果需要从数据库中取数). 1.1.设置授权信息 启动集算报表设计器,选择工具-选项,切换到"集算器选项&q