集算器计算比上期、同期比的代码示例

 

转自【http://blog.sina.com.cn/s/blog_e4de31d00102vc2o.html】
比上期是指用当期数据和上期数据进行比较,一般以月作为时间间隔,比如用 4 月份的销售额除以 3 月份的销售额,这称为 4 月份的比上期。除了月,也可以用小时、日、周、季度作为时间间隔。同期比是指用当期数据和上一周期的同期数据进行比较,比如 2014 年 4 月份的销售额除以 2013 年 4 月份的销售额。实际的业务中通常会进行多期数据的计算,以便观察数据的变化趋势。

比上期和同期比是常见的跨行组计算,集算器可以方便地实现此类算法,下面用一个例子来说明。

案例描述:

        指定时间段,计算该时间段内各月份的销售额比上期和同期比。数据来源于订单表,部分数据如下:

imagepng

集算器代码:

A1=esProc.query(“select * from sales3 where OrderDate>=? and OrderDate<=?”,begin,end)

A2=A1.groups(year(OrderDate):y,month(OrderDate):m;sum(Amount):mAmount)

A3=A2.derive(mAmount/mAmount[-1]:lrr)

A4=A3.sort(m)

A5=A4.derive(if(m==m[-1],mAmount/mAmount[-1],null):yoy)

代码解读:

A1:按时间段从数据库查询数据,begin 和 end 是外部参数,比如 begin=“2011-01-01”,end=“2014-07-08”(即当天日期,可用 now() 函数获取)。部分查询结果如下:

imagepng

        A2: 对订单按照年份和月份进行分组,并汇总求得每月的销售额。部分计算结果如下:

imagepng

       A3: 增加一个新的字段 lrr,即按月比上期,其表达式为 mAmount/mAmount[-1]。代码中 mAmount 代表当期销售额,mAmount[-1] 代表上期销售额。需要注意的是,初始月份的比上期值为空(即 2011 年 1 月)。计算结果如下:

imagepng

        A4: 将 A3 按照月、年排序,以便计算同期比。完整的代码应当是:=A3.sort(m,y),由于 A3 本来就是按年排序的,因此只需按月排序就可以达到目的,即 A3.sort(m),这样性能也高。部分计算结果如下:

imagepng

        A5: 增加一个新的字段 yoy,即月销售额的同期比,其表达式为 if(m==m[-1],mAmount/mAmount[-1],null),这表示月份相同时才进行同期比计算。需要注意的是,初始年份(即 2011 年)各月份的同期比恒为空。部分结果如下:

imagepng

   如果观察不便,可以加一行代码 A6=A5.sort(y:-1,m),即将 A5 按照年逆序月正序进行排序。需要注意的是,数据只到 2014 年 7 月为止。结果如下:

imagepng