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'