Welcome 微信登录

首页 / 数据库 / MySQL / 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 更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12Oracle的动态SQL和动态游标举例Oracle事物处理中回滚段容量的问题相关资讯      Oracle入门教程 
  • 使用SQLT来构建Oracle测试用例  (08/28/2014 06:17:41)
  • Oracle AUTOTRACE 统计信息  (02/18/2013 08:25:40)
  • Linux Oracle服务启动&停止脚本与  (12/16/2012 14:42:37)
  • Oracle入门教程:把表和索引放在不  (07/13/2013 11:21:40)
  • Oracle直接路径加载--append的深度  (02/07/2013 08:26:36)
  • Oracle Connect By用法  (12/16/2012 13:36:10)
本文评论 查看全部评论 (0)
表情: 姓名: 字数