Oracle计算环比浅谈

转自:微点阅读 https://www.weidianyuedu.com

环比就是今年第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