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