Oracle计算环比示例

环比就是今年第n月与第n-1月或第n+1月比;同比就是今年第n月与去年第n月比。

建测试表,假设是个销售数量表:

create table t (dt date,cnt number);

随便插入些测试数据,最后表的内容如下:

DT                CNT
---------- ----------
2012-02-09         15
2012-02-21          2
2012-03-23          1
2012-03-23          5
2012-04-23          2
2012-05-12         20
2012-07-01         20
2012-07-21         20

  显示环比,如果某个月没有销售,就有点儿麻烦。
  先想个办法,显示本年度的1至12月,有个很有技巧的技术来实现:
SQL> set pagesize 20
SQL> with m as (select '2012-'||lpad(rownum,2,'0') v from dual connect by level<=12) select * from m;
V
---------
2012-01
2012-02
2012-03
2012-04
2012-05
2012-06
2012-07
2012-08
2012-09
2012-10
2012-11
2012-12

  接下来就容易了,两个表外连,使用lag统计函数就可以了。
with m as (select '2012-'||lpad(rownum,2,'0') v from dual connect by level<=12)
select m.v "月份",nvl(sum(t.cnt),0) "销售数量",
lag(nvl(sum(t.cnt),0),1) over (order by m.v) "上月销量数量",
nvl(sum(t.cnt),0)-lag(nvl(sum(t.cnt),0),1) over (order by m.v) "环比增加量",
round((case when nvl(sum(t.cnt),0)=0 then null else (nvl(sum(t.cnt),0)-lag(nvl(sum(t.cnt),0),1) over (order by m.v))/nvl(sum(t.cnt),0) end)*100,1) "环比增加比例(%)"
from m left outer join t
on m.v=to_char(t.dt,'yyyy-mm') group  by m.v order by 1

月份        销售数量 上月销量数量 环比增加量 环比增加比例(%)
--------- ---------- ------------ ---------- ---------------
2012-01            0
2012-02           17            0         17             100
2012-03            6           17        -11          -183.3
2012-04            2            6         -4            -200
2012-05           20            2         18              90
2012-06            0           20        -20
2012-07           40            0         40             100
2012-08            0           40        -40
2012-09            0            0          0
2012-10            0            0          0
2012-11            0            0          0
2012-12            0            0          0

相关推荐