报表如何实现特殊分组统计功能吗?

报表工具一般都会提供按某个字段分组的表达式,如按自然月分组统计,但有时候需要按不规则月份来分组,例如,某企业从1月16日开始实行某种特殊的价格策略或营销活动,因此以后都想以每月16号为界来统计产品销售情况。这里所谓不规则月份就是指:如果起始时间是2013-01-16,则将2013-01-16到2013-01-16作为一组,将2013-02-16到2013-02-16作为一组。有的情况是需要按数值区间统计,比如:将订单金额按照1000年,2000年,4000年划分为四个区间,每个区间一组订单,统计各组订单的总额。

这类特殊分组,SQL很难写,报表工具也都无法应对,只能是硬编码的方式在外部实现,然后通过每个报表工具专有的方式将外部实现整合起来。实现这类需求,一般就是根据分组条件循环添加到某个子集合中,还需在子集合中分别实现sum (), count (*), topN()等聚合动作,代码冗长,改动和维护都很麻烦。其实这类需求使用报表工具+集算器的方式都很简单,集算器代码如下,

不规则月份统计:


<强> <强> B <强> 1 =连接(“演示”)<强> 2 =A1。OrderDate查询(“选择OrderID、数量从salesall OrderDate>=? OrderDate<? OrderDate命令”,startDate可以,endDate) <强> 3 =interval@m (startDate可以endDate)=startDate可以| A3。(elapse@m (startDate可以~))<强> 4 =A2.group (B3.pseg(向);轮(~ .sum(数量),2),B3(#)) <强> 5 =A4.new(#:数量,# 2:TotalAmount, # 3: startDate可以)<强> 6 祝辞A1.close 7() <强> 返回A5

A7返回结果:

报表如何实现特殊分组统计功能?

集算器提供JDBC和ODBC接口,计算结果很容易被报表工具使用,代码详解及报表整合参见集算器如何协助Birt实现不规则月份统计。没用报表工具的,可以直接在Java代码中嵌入SPL脚本,使用方法参见Java如何调用SPL脚本

数值区间分组:


A1=销售=db。查询(“select * from销售”)2=byFac=[" & lt;=1000 "、" ?在1000,,& lt;=2000”、“吗?在2000年,,& lt;=4000”、“吗?在4000”)3=sales.enum (byFac、数量)4=A18.new (byFac (#): byFac, ~ .sum(数量):金额)

A4结果如下:

报表如何实现特殊分组统计功能?

详解参见SPL简化SQL案例详解:固定分组

还有一些情况表面上看不出是需要分组,其实如果用分组的思路解决起来十分方便,比如,根据门禁出入情况汇总考勤,如何统计考勤记录,这类有序分组运算用SQL都不好写,用集算器SPL脚本就很简单。有关集算器安装使用,获得免费授权和相关技术资料,参见如何使用集算器。


报表如何实现特殊分组统计功能吗?