用分析函數計算環比、同比oracle


1.普及一下概念

環比 = 2018年10月/2018年09月(同一時期內不同時間段的比較)

同比 = 2018年10月/2017年10月(不同時期內相同時間段的比較)

環比增長率 =  (2018年10月-2018年09月)/2018年09月

同比增長率 =  (2018年10月-2017年10月)/2017年10月

2.關鍵sql 解釋

(1)分析函數 

lead(params,m,n)  以params為目標向下m位取數,當取不到時默認為 n,

lag(params,m,n)  以params為目標向上m位取數,當取不到時默認為 n

over(order by...) 相當於 order by...

partition by ... 根據參數最為分割,將相同的先分割到一塊

3.具體sql例子

//按月統計發票的總金額、總稅額、總票數、月同比、月環比 、同比增長率、環比增長率

select  a.sumquantity,
nvl(round(a.sumquantity /lag(a.sumquantity) over( order by a.yearmonth)*100, 2), '0') ||'%' sumquantityHB,
nvl(round((a.sumquantity-a.lagAHB)/lag(a.sumquantity) over( order by a.yearmonth)*100, 2), '0') ||'%' sumquantityHBG,//計算環比(按月) 關鍵代碼lag()over(partition by 月份/年份 order by 排序條件)
nvl(round(a.sumquantity/lag(a.sumquantity) over(partition  by to_char((to_date(a.yearmonth, 'yyyy/MM')), 'MM')  order by a.yearmonth)*100, 2), '0')||'%' sumquantityTB,
nvl(round((a.sumquantity-a.lagATB)/lag(a.sumquantity) over(partition  by to_char((to_date(a.yearmonth, 'yyyy/MM')), 'MM')  order by a.yearmonth)*100, 2), '0') ||'%' sumquantityTBG,

a.totalamount,

nvl(round(a.totalamount/lag(a.totalamount) over( order by a.yearmonth)*100, 2), '0')||'%' totalamountHB,

nvl(round((a.totalamount-a.lagBHB)/lag(a.totalamount) over( order by a.yearmonth)*100, 2), '0') || '%' totalamountHBG,
nvl(round(a.totalamount/lag(a.totalamount) over(partition  by to_char((to_date(a.yearmonth, 'yyyy/MM')), 'MM')  order by a.yearmonth)*100, 2), '0')||'%' totalamountTB,
nvl(round((a.totalamount-a.lagBTB)/lag(a.totalamount) over(partition  by to_char((to_date(a.yearmonth, 'yyyy/MM')), 'MM')  order by a.yearmonth)*100, 2), '0')||'%' totalamountTB,

a.taxamount ,

nvl(round(a.taxamount/lag(a.taxamount) over( order by a.yearmonth)*100, 2), '0')||'%' taxamountHB,
nvl(round((a.taxamount-a.lagCHB)/lag(a.taxamount) over( order by a.yearmonth)*100, 2), '0')||'%' taxamountHBG,
nvl(round(a.taxamount/lag(a.taxamount) over(partition  by to_char((to_date(a.yearmonth, 'yyyy/MM')), 'MM')  order by a.yearmonth)*100, 2), '0')||'%' taxamountTB,
nvl(round((a.taxamount-a.lagCTB)/lag(a.taxamount) over(partition by to_char((to_date(a.yearmonth,'yyyy/MM')),'MM') order bya.yearmonth)*100,2),'0')||'%' taxamountTBG
from
( select yearMonth, sumQuantity, lag(sumQuantity) over( order by yearmonth) lagAHB ,

lag(sumQuantity) over(partition  by to_char((to_date( yearmonth, 'yyyy/MM')), 'MM')  order by yearmonth) lagATB,

totalAmount, lag(totalAmount) over(order by yearmonth) lagBHB,

lag(totalAmount) over(partition  by to_char((to_date( yearmonth, 'yyyy/MM')), 'MM')  order by yearmonth) lagBTB,

taxAmount , lag(taxAmount) over(partition  by to_char((to_date( yearmonth, 'yyyy/MM')), 'MM')  order by yearmonth) lagCTB,

lag(taxAmount) over( order by yearmonth) lagCHB //計算環比(按月) 關鍵代碼lag()over(partition by 月份/年份 order by 排序條件)
from
( select to_char(billing_date, 'yyyy/MM') yearMonth, count(1) sumQuantity , nvl(sum(total_amount) , 0.00) totalAmount, nvl(sum(total_tax) , 0.00) taxAmount
from input_original_account
where 1=1  group by to_char(billing_date, 'yyyy/MM'))//先按月份對要統計的數據進項分組

) a

where 1=1 and a.yearMonth='2018/09'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM