集算器實現 birt 等報表工具中不規則月份統計
業務報表中,常常需要基於時間段進行分組統計,特別是按月份分組統計。一般情況如果按自然月就簡單了,但有時候也會需要按不規則月份來分組。例如,某企業從 1 月 16 日開始實行某種特殊的**策略或營銷活動,因此以後都想以每月 16 號為界來統計產品銷售情況。這裡所謂不規則月份就是指: 如果起始時間是 2013-01-16,則將 2013-01-16 到 2013-02-15 作為一組,將 2013-02-16 到 2013-03-15 作為一組。更特別的,如果起始時間是 2013-01-31,則可能要求將 2013-01-31 到 2013-02-27 作為一組,而將 2013-02-28 到 2013-03-30 作為一組,也就是「從每月最後一天」開始分組。
怎麼樣?小夥伴們是不是有點傻眼了?對於 birt 等報表工具,一般都會提供按自然月分組的表示式,但也卻都難以應對這種不規則月份分組的表示式。如果要解決這個問題,往往需要編寫程式實現自定義報表資料集,而在程式中按這種規則進行分組,不但程式設計工作量不小,更重要的是基本無法通用。
現在好了,如果在報表工具中引入集算器,解決這個問題就易如反掌了。下面我們就以 birt 報表工具為例,講解一下實現的過程。對其它報表工具來說,也基本大同小異。
在本例中,要統計企業從 2013-01-16 日開始到 2013-08-15 結束,每個月的銷售總額。資料表 salesall 中原始資料如下:
最後需要得到如下圖所示的目標錶樣:
我們直接來看集算器解決這個問題的 spl **:
ab
1=connect("demo")
2=a1.query("select orderid,amount,orderdate from salesall where orderdate>=? and orderdate order by orderdate",startdate,enddate)
3=interval@m(startdate,enddate)
=startdate|a3.(elapse@m(startdate,~))
4=a2.group(b3.pseg(orderdate);round(~.sum(amount),2),b3(#))
5=a4.new(#:number,#2:totalamount,#3:startdate)
6>a1.close()
7return a5
a1 連線資料庫
a2 從資料庫訂單表中查出統計開始日期到結束日期之間的訂單資料,startdate 和 enddate 是日期引數。
a3 根據起止時間算出月份間隔,比如 2013-01-16 和 2013-08-15 間隔 7 個月。
b3 根據起始時間和日期間隔算出不規則月份的開始日期,並將起始時間插入第 1 位。「|」表示合併,「~」表示集合中的當前成員,即數字 1 到 7,結合不同的選項,elapse 函式可以正確計算各種不規則月份的情況。
a4 按 b3 區間對 a2 分組,統計出不規則月份的銷售額,保留兩位小數,並將 b3 作為最後一列。函式 pseg 可返回引數,也就是訂購日期所在的區間號。~.sum(amount)中的~表示分組後的當前組。# 表示 a2 當前組號。
a5 取出 a4 的組號作為 number,第 2 列為 totalamount,第 3 列為分組的 startdate,生成新的結果序表。
a6 關閉資料庫
a7 將 a5 作為資料集返回給報表工具。
將集算器 spl **存為 orders.dfx 檔案,然後引入到 birt 報表中。如何引入請參看幹學院文章《birt 呼叫 spl 指令碼》。
在 birt 中設計簡單的 list 表如下:
報表呼叫集算器的方法和呼叫儲存過程完全一樣,比如在 birt 的儲存過程資料集中可以用 call orders(?,?) 來呼叫。輸入開始日期引數 2013-01-16、結束日期引數 2013-08-15 後,預覽報表就可以看到要求的目標錶樣了。
Birt 如何實現不規則月份統計
業務報表中,常常需要基於時間段進行分組統計,特別是按月份分組統計。一般情況如果按自然月就簡單了,但有時候也會需要按不規則月份來分組。例如,某企業從 1 月 16 日開始實行某種特殊的 策略或營銷活動,因此以後都想以每月 16 號為界來統計產品銷售情況。這裡所謂不規則月份就是指 如果起始時間是 201...
報表例子 用BIRT實現不規則月份統計
不規則月份統計 如果起始時間是2014 01 10,則將2014 01 10到2014 02 09作為一組,將2014 02 10到2014 03 9作為一組。如果起始時間是2014 01 31,則將2014 02 27作為一組,將2014 02 28到2014 03 30作為一組。集算器 a1 根...
不規則月份統計報表的實現
不規則月份統計 如果起始時間是2014 01 10,則將2014 01 10到2014 02 09作為一組,將2014 02 10到2014 03 9作為一組。如果起始時間是2014 01 31,則將2014 02 27作為一組,將2014 02 28到2014 03 30作為一組。集算器 a1 根...