简化SQL式计算之行间计算
? ?在數據庫應用開發中,我們經常需要面對復雜的SQL式計算,行間計算就是其中一種,比如用每月的銷售額除以上月的銷售額,求比上期,或用每月銷售額除以去年同月的銷售額,求同期比。有些數據庫沒有提供SQL2003標準的窗口函數(或支持的不完備),完成行間計算就需要更換思路使用連接(join)運算替代,不僅難以理解而且運算效率低下。即使可以使用窗口函數仍要面臨嵌套子查詢等問題,SQL語句仍較為冗長。而使用集算器可以用更簡單直觀的代碼來實現行間計算,下面用一個例子來說明。
? ?表sales存儲著多年的訂單數據,請根據該表計算出指定時間段內各月份的銷售額比上期和同期比。部分源數據如下:
? ?集算器代碼:
? ?A1:按時間段從數據庫查詢數據,begin和end是外部參數,比如begin=”2011-01-01 00:00:00″,end=”2014-07-08 00:00:00″。部分查詢結果如下:
? ?A2=A1.groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):mAmount)
? ?這句代碼對訂單按照年份和月份進行分組,并匯總求得每月的銷售額。函數groups可進行分組匯總運算,其參數分為兩部分,分號之前是分組表達式,即:year(OrderDate):y,month(OrderDate):m,分號之后是匯總表達式,即sum(Amount):mAmount。匯總后的字段命名為mAmount。部分計算結果如下:
? A3=A2.derive(mAmount/mAmount[-1]:lrr)
? 這句代碼在A2基礎上增加一個新的字段lrr,即按月比上期,其表達式為mAmount/mAmount[-1]。集算器可以用 [N]或[-N]來表達相對于當前記錄之后的第N條記錄,或之前的第N條記錄,因此代碼中mAmount代表當期銷售額,mAmount[-1]代表上期銷售額。計算結果如下:
? ?需要注意的是,初始月份的比上期值為空(即2011年1月)。
? ?A4=A3.sort(m)
? ?這句代碼將A3按照月、年排序,以便計算同期比。完整的代碼應當是:=A3.sort(m,y),由于A3本來就是按年排序的,因此只需按月排序就可以達到目的,即A3.sort(m),這樣性能也高。部分計算結果如下:
? ?A5=A4.derive(if(m==m[-1],mAmount/mAmount[-1],null):yoy)
? ?這句代碼在A4的基礎上增加一個新的字段yoy,即月銷售額的同期比,其表達式為if(m==m[-1],mAmount/mAmount[-1],null),這表示月份相同時才進行同期比計算。函數if有三個參數,其中m==m[1-]為布爾表達式,當該條件為True時,返回mAmount/mAmount[-1],當該條件為False時,返回null。需要注意的是,初始年份(即2011年)各月份的同期比衡為空。部分結果如下:
? ?如果觀察不便,可以加一行代碼A6=A5.sort(y:-1,m),即將A5按照年逆序月正序進行排序。需要注意的是,數據只到2014年7月為止。結果如下:
? ?另外,集算器可被報表工具或java程序調用,調用的方法也和普通數據庫相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的計算結果,具體方法可參考相關文檔。
總結
以上是生活随笔為你收集整理的简化SQL式计算之行间计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 慕课软件质量保证与测试(第六章.课后作业
- 下一篇: [方法“Boolean Contains