91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在 Birt 中實現交叉表的動態分組

發布時間:2020-04-29 13:23:21 來源:網絡 閱讀:136 作者:raqsoft 欄目:大數據

來源:

??https://forums.opentext.com/forums/discussion/173783/dynamic-grouping-of-crosstab-in-birt#latest

?

??在業務填報中,有時會需要基于時間段進行動態交叉分組統計,根據時間段長短實現按天、按周、按月、按年動態分組。例如:某企業根據業務需要,需按照2個參數(開始日期、結束日期)實現一段時間內訂單的統計。統計規則如下:

??示例:根據輸入的參數值,計算日期之間的差異。

??var diff = 結束日期-開始日期? ? ? ? ? ? ? ? ---- 相隔的天數
??如果(diff <15)
????將“日期組”分組以顯示為日期
??如果(diff>15)
????將“日期組”分組以顯示為周
??如果(diff >30)
????將“日期組”分組以顯示為月份
??如果(diff>365)
????將“日期組”分組以顯示為年份

?

??小伙伴們是不是有點不知所措了呢?上述問題實質上就是一個數據準備的問題,可是SQL或scripted data sources的方式代碼難寫,工作量大;退而求次使用報表隱藏列的方式,既不通用又非常別扭。那么,一個更好的解決方案就是在報表工具中引入集算器,解決諸類問題將輕而易舉。下面我們就以Birt報表工具為例,介紹一下實現過程。對于其他的報表工具,也是大同小異。

?

??在本例中,要根據參數輸入,統計企業從2012-07-04開始到2014-05-06結束這個時間段內的訂單總數,運貨費總數,訂單金額總數。數據表“ORDERS”中的原始數據如下:

??在 Birt 中實現交叉表的動態分組

?

??我們直接來看集算器解決這個問題的SPL代碼:


ABC
1=connect("demo")//連接數據庫
2=A1.query("select ? ORDERID,ORDERDATE,FREIGHT,ORDERAMOUNT from ORDERS where ORDERDATE >=? and ? ORDERDATE <=?",startDate,endDate)//從 ORDERS 表中查詢出統計開始日期到結束日期之間的訂單數據,startDate 和 endDate 是日期參數。
3=interval(startDate,endDate)//計算開始日期和結束日期的間隔天數
4if A3>365//如果天數間隔大于 365 天,則按年份分組
5
=startDate|A3.(elapse@y(startDate,~))//計算出按年份的分組序表
6
=A2.group(B5.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B5(#):BeginDate)//按 B5 區間對 A2 分組,統計出訂單總數,運貨費總數,訂單金額總數,保留兩位小數,并將 B5 作為最后一列。
7
=B6.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount)//取出需要的數據列,生成新的結果序表
8
>A1.close()//關閉數據庫
9
return B7//返回按年份分組的結果集
10else if A3>30//如果天數間隔大于 30 天 & 小于等于 365 天,則按月份分組
11
=startDate|A3.(elapse@m(startDate,~))//計算出按月份的分組序表
12
=A2.group(B11.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B11(#):BeginDate)//按 B11 區間對 A2 分組,統計出訂單總數,運貨費總數,訂單金額總數,保留兩位小數,并將 B11 作為最后一列。
13
=B12.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount)
14
>A1.close()
15
return B13//返回按月份分組的結果集
16else if A3>15//如果天數間隔大于 15 天 & 小于等于 30 天,則按星期分組
17
=startDate|A3.(elapse(startDate,7*~))//計算出按星期的分組序表
18
=A2.group(B17.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B17(#):BeginDate)/按 B17 區間對 A2 分組,統計出訂單總數,運貨費總數,訂單金額總數,保留兩位小數,并將 B17 作為最后一列。
19
=B18.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount)
20
>A1.close()
21
return B19//返回按星期分組的結果集
22else//如果天數間隔小于 15 天,則按日期分組
23
=startDate|A3.(elapse(startDate,~))//計算出按日期的分組序表
24
=A2.group(B23.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(FREIGHT),2):TotalFreight,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,B23(#):BeginDate)/按 B23 區間對 A2 分組,統計出訂單總數,運貨費總數,訂單金額總數,保留兩位小數,并將 B23 作為最后一列。
25
=B24.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalFreight,#4:TotalOrderAmount)
26
>A1.close()
27
return B25//返回按日期分組的結果集

?

??將集算器SPL代碼存為order.dfx文件,然后引入到Birt報表中。如何引用請參看乾學院文章《BIRT調用SPL腳本》。

?

??在BIRT報表中設計表如下:

??在 Birt 中實現交叉表的動態分組

?

??報表調用集算器的方法和調用存儲過程完全一樣,比如在 BIRT 的存儲過程數據集中可以用 call orders(?,?) 來調用。

??接下來,我們看一下WEB預覽時,輸入不同參數的預覽結果:

??(1)輸入參數:開始時間 2012-07-04,結束時間 2014-05-06??? 間隔天數大于365,按照年份分組顯示。

??在 Birt 中實現交叉表的動態分組

??在 Birt 中實現交叉表的動態分組

?

??(2)輸入參數:開始時間 2012-07-15,結束時間 2012-12-03??? 間隔天數大于30,按照月份分組顯示。

??在 Birt 中實現交叉表的動態分組

??在 Birt 中實現交叉表的動態分組

?

??(3)輸入參數:開始時間 2012-07-20,結束時間 2012-08-15??? 間隔天數大于15,按照星期分組顯示。

??在 Birt 中實現交叉表的動態分組

??在 Birt 中實現交叉表的動態分組

?

??(4)輸入參數:開始時間 2012-07-04,結束時間 2012-07-18??? 間隔天數小于15,按照日期分組顯示。

??在 Birt 中實現交叉表的動態分組

??在 Birt 中實現交叉表的動態分組



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜宾县| 团风县| 嵩明县| 蓬莱市| 东阿县| 洪洞县| 泽库县| 河池市| 故城县| 南充市| 灌南县| 府谷县| 邓州市| 安龙县| 汉沽区| 清流县| 扎囊县| 鹤岗市| 桐柏县| 东兰县| 临澧县| 广丰县| 霞浦县| 商河县| 铁岭县| 灵石县| 温泉县| 万源市| 菏泽市| 循化| 峨边| 昭苏县| 彝良县| 垫江县| 霍山县| 蚌埠市| 宁夏| 凭祥市| 桐城市| 锦屏县| 庄河市|