報表開發中通用group_concat函數的實現方法,報表group_concat
使用Jasper或BIRT等報表工具時,常會碰到一些非常規的統計,用報表工具本身或SQL都難以處理,如在MSSQL/Oracle中,想展現類似group_concatFunction Compute結果的報表。
集算器具有結構化強計算引擎,整合簡單,可以協助報表工具方便地實現此類需求。下面以MSSQL為例,來說明通用group_concat函數的實現過程。
MSSQL的表Table1有四個欄位,欄位Col1、Col2、Col3是分組欄位,Col4是彙總欄位,部分資料如下:
報表工具需要的資料來源如下:
集算器代碼:
A1=mssqlDB.query("select * fromtable1 where Col1 in"+arg)
這句代碼執行SQL,從資料庫中取出資料。其中arg是來自報表的參數,比如(10,20)。A1的計算結果如下:
A2=A1.group(Col1,Col2,Col3;~.(Col4).string@d():Col4)
這句代碼將A1按照Col1、Col2、Col3分組,並將每組資料中的Col4以逗號拼接在一起。代碼中的~表示每組資料,比如第一組有三條記錄。~.(Col4)表示取出每組資料中的Col4欄位,比如第一組就是集合[A12G3 , K78DE , MAT12]。函數string可將集合中的成員拼接成一個字串,預設分隔符號是逗號,選項@d表示不給成員加引號,因此運算式[A12G3 , K78DE , MAT12].string@d()等於” A12G3 ,K78DE , MAT12”。運算式“:Col4”表示將前面的計算結果重新命名為Col4。
A3就是本案例的最終計算結果,如下:
A3:result A2
這句代碼將A2中的資料返回給報表工具。
集算器對外提供JDBC介面,報表工具會將集算器識別為普通資料庫,整合方案請參考相關文檔。
接下來以JasperReport為例設計報表,表樣如下:
預覽後可以看到報表結果:
需要注意的是,報表調用集算器的方法和調用預存程序一樣,比如將本指令碼儲存為group_concat.dfx,則在的JasperReport的SQL設計器中可以用group_concat $P{arg}來調用。