使用Jasper或BIRT等報表工具時,常會碰到1些非常規(guī)的統(tǒng)計,用報表工具本身或SQL都難以處理,如在MSSQL/Oracle中,想展現(xiàn)類似group_concat函數(shù)計算結(jié)果的報表。
集算用具有結(jié)構(gòu)化強(qiáng)計算引擎,集成簡單,可以協(xié)助報表工具方便地實現(xiàn)此類需求。下面以MSSQL為例,來講明通用group_concat函數(shù)的實現(xiàn)進(jìn)程。
MSSQL的表Table1有4個字段,字段Col1、Col2、Col3是分組字段,Col4是匯總字段,部份數(shù)據(jù)以下:
報表工具需要的數(shù)據(jù)源以下:
集算器代碼:
A1=mssqlDB.query("select * fromtable1 where Col1 in"+arg)
這句代碼履行SQL,從數(shù)據(jù)庫中取出數(shù)據(jù)。其中arg是來自報表的參數(shù),比如(10,20)。A1的計算結(jié)果以下:
A2=A1.group(Col1,Col2,Col3;~.(Col4).string@d():Col4)
這句代碼將A1依照Col1、Col2、Col3分組,并將每組數(shù)據(jù)中的Col4以逗號拼接在1起。代碼中的~表示每組數(shù)據(jù),比如第1組有3條記錄。~.(Col4)表示取出每組數(shù)據(jù)中的Col4字段,比如第1組就是集合[A12G3 , K78DE , MAT12]。函數(shù)string可將集合中的成員拼接成1個字符串,默許分隔符是逗號,選項@d表示不給成員加引號,因此表達(dá)式[A12G3 , K78DE , MAT12].string@d()等于” A12G3 ,K78DE , MAT12”。表達(dá)式“:Col4”表示將前面的計算結(jié)果重命名為Col4。
A3就是本案例的終究計算結(jié)果,以下:
A3:result A2
這句代碼將A2中的數(shù)據(jù)返回給報表工具。
集算器對外提供JDBC接口,報表工具會將集算器辨認(rèn)為普通數(shù)據(jù)庫,集成方案請參考相干文檔。
接下來以JasperReport為例設(shè)計報表,表樣以下:
預(yù)覽后可以看到報表結(jié)果:
需要注意的是,報表調(diào)用集算器的方法和調(diào)用存儲進(jìn)程1樣,比如將本腳本保存為group_concat.dfx,則在的JasperReport的SQL設(shè)計器中可以用group_concat $P{arg}來調(diào)用。