您好,登錄后才能下訂單哦!
報表工具一般都會提供按某個字段分組的表達式,如按自然月分組統計,但有時候需要按不規則月份來分組,例如,某企業從 1 月 16 日開始實行某種特殊的價格策略或營銷活動,因此以后都想以每月 16 號為界來統計產品銷售情況。這里所謂不規則月份就是指: 如果起始時間是 2013-01-16,則將 2013-01-16 到 2013-02-15 作為一組,將 2013-02-16 到 2013-03-15 作為一組。有的情況是需要按數值區間統計,比如:將訂單金額按照1000、2000、4000劃分為四個區間,每個區間一組訂單,統計各組訂單的總額。
這類特殊分組,SQL很難寫,報表工具也都無法應對,只能是硬編碼的方式在外部實現,然后通過每個報表工具專有的方式將外部實現整合起來。實現這類需求,一般就是根據分組條件循環添加到某個子集合中,還需在子集合中分別實現sum(),count(*),topN()等聚合動作,代碼冗長,改動和維護都很麻煩。其實這類需求使用報表工具+集算器的方式都很簡單,集算器代碼如下,
不規則月份統計:
A | B | |
1 | =connect("demo") | |
2 | =A1.query("select ? ? OrderID,Amount,OrderDate from salesall where OrderDate>=? and OrderDate<? order by ? ? OrderDate",startDate,endDate) | |
3 | =interval@m(startDate,endDate) | =startDate|A3.(elapse@m(startDate,~)) |
4 | =A2.group(B3.pseg(OrderDate);round(~.sum(Amount),2),B3(#)) | |
5 | =A4.new(#:Number,#2:TotalAmount,#3:StartDate) | |
6 | >A1.close() | |
7 | return A5 |
A7返回結果:
集算器提供JDBC和ODBC接口,計算結果很容易被報表工具使用,代碼詳解及報表整合參見 集算器如何協助Birt實現不規則月份統計 。沒用報表工具的,可以直接在Java代碼中嵌入SPL腳本,使用方法參見 Java 如何調用 SPL 腳本? ??
數值區間分組:
A | |
1 | =sales=db.query("select * from ? sales") |
2 | =byFac=["?<=1000","?>1000 ? && ?<=2000","?>2000 && ? ?<=4000","?>4000"] |
3 | =sales.enum(byFac,AMOUNT) |
4 | =A18.new(byFac(#):byFac,~.sum(AMOUNT):AMOUNT) |
A4結果如下:
詳解參見 SPL 簡化 SQL 案例詳解:固定分組
還有一些情況表面上看不出是需要分組,其實如果用分組的思路解決起來十分方便,比如,根據門禁出入情況匯總考勤,如何統計考勤記錄 ,這類有序分組運算用SQL都不好寫,用集算器SPL腳本就很簡單。有關集算器安裝使用、獲得免費授權和相關技術資料,參見如何使用集算器 。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。