不規則跨行計算報表

   使用Jasper或BIRT等報表工具時,常會碰到一些非常規的統計,用報表工具本身或SQL都難以處理,比如源數據中有條特殊數據,其他數據都要和它進行佔比、求和等計算。集算器具有結構化強計算引擎,集成簡單,可以協助報表工具方便地實現此類需求。下面通過一個例子來說明不規則跨行計算報表的實現過程。

  數據庫表majorSum存儲着某醫院重點科室以及全院的患者統計,報表需要按字母順序呈現各科室的患者佔比,並在最後保留全院患者數量。源數據如下:



 

   期望的報表如下:

department

patient

Accident and emergency (A&E)

7.03%

Anaesthetics

12.37%

Breast screening

12.37%

Discharge lounge

14.61%

Ear nose and throat

15.06%

Haematology

17.43%

Neurology

5.23%

Cardinal Community Hospital

44562

 

   集算器可以準備出報表需要的數據,代碼如下:



 

   A1=myDB1.query(“select department,patient from majorSum order by department”)

  執行SQL,在數據源myDB1中檢索majorSum表,結果如下:



 

   A2=A1.maxp(patient)

  取出全院患者所在的記錄,函數maxp可以取出字段值最大的記錄,即Cardinal Community Hospital。

  A3=A1\A2

  從完整記錄A1中去除全院記錄A2,運算符“\”可求出集合間的差集。

  A4=A3.run(string(patient/A2.patient,”#.##%”):patient)

  計算各科室患者的佔比。函數run可對A3進行循環計算,函數string可將數字格式化爲字符串。結果如下:



 

   A5=A4|A2

  將全院記錄和佔比數據合併。運算符“|”相當於函數union。集算器支持泛型二維表,因此字符串和數字可以存儲在同一個字段。A5的計算結果就是報表需要的數據,如下:



 

   A6:result A5

  將A5返回給報表工具。集算器對外提供JDBC接口,報表工具會將集算器識別爲普通數據庫,集成方案請參考相關文檔。

  上述代碼是分步計算,便於觀察中間結果,熟練後可以簡化爲下面兩句代碼:
    A1=myDB1.query(“select department,patient from majorSum order by department”);
    A2:result(total=A1.maxp(patient),(A1\total).run(string(patient/total.patient,”#.##%”):patient)|total)

  接下來以BIRT爲例設計一張簡單的list表,模板如下:



 

   預覽後可以看到報表結果:



 

   報表調用集算器的方法和調用存儲過程一樣,比如將本腳本保存爲irregulProportion.dfx,則在BIRT的存儲過程設計器中可以用call irregulProportion()來調用。同樣地,集算器也支持報表參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章