您好,登錄后才能下訂單哦!
報(bào)表工具一般都會提供按某個(gè)字段分組的表達(dá)式,如按自然月分組統(tǒng)計(jì),但有時(shí)候需要按不規(guī)則月份來分組,例如,某企業(yè)從 1 月 16 日開始實(shí)行某種特殊的價(jià)格策略或營銷活動(dòng),因此以后都想以每月 16 號為界來統(tǒng)計(jì)產(chǎn)品銷售情況。這里所謂不規(guī)則月份就是指: 如果起始時(shí)間是 2013-01-16,則將 2013-01-16 到 2013-02-15 作為一組,將 2013-02-16 到 2013-03-15 作為一組。有的情況是需要按數(shù)值區(qū)間統(tǒng)計(jì),比如:將訂單金額按照1000、2000、4000劃分為四個(gè)區(qū)間,每個(gè)區(qū)間一組訂單,統(tǒng)計(jì)各組訂單的總額。
這類特殊分組,SQL很難寫,報(bào)表工具也都無法應(yīng)對,只能是硬編碼的方式在外部實(shí)現(xiàn),然后通過每個(gè)報(bào)表工具專有的方式將外部實(shí)現(xiàn)整合起來。實(shí)現(xiàn)這類需求,一般就是根據(jù)分組條件循環(huán)添加到某個(gè)子集合中,還需在子集合中分別實(shí)現(xiàn)sum(),count(*),topN()等聚合動(dòng)作,代碼冗長,改動(dòng)和維護(hù)都很麻煩。其實(shí)這類需求使用報(bào)表工具+集算器的方式都很簡單,集算器代碼如下,
不規(guī)則月份統(tǒng)計(jì):
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返回結(jié)果:
集算器提供JDBC和ODBC接口,計(jì)算結(jié)果很容易被報(bào)表工具使用,代碼詳解及報(bào)表整合參見 集算器如何協(xié)助Birt實(shí)現(xiàn)不規(guī)則月份統(tǒng)計(jì) 。沒用報(bào)表工具的,可以直接在Java代碼中嵌入SPL腳本,使用方法參見 Java 如何調(diào)用 SPL 腳本? ??
數(shù)值區(qū)間分組:
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結(jié)果如下:
詳解參見 SPL 簡化 SQL 案例詳解:固定分組
還有一些情況表面上看不出是需要分組,其實(shí)如果用分組的思路解決起來十分方便,比如,根據(jù)門禁出入情況匯總考勤,如何統(tǒng)計(jì)考勤記錄 ,這類有序分組運(yùn)算用SQL都不好寫,用集算器SPL腳本就很簡單。有關(guān)集算器安裝使用、獲得免費(fèi)授權(quán)和相關(guān)技術(shù)資料,參見如何使用集算器 。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。