使用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()來調用。同樣地,集算器也支持報表參數。