求助 。。。oracle 同期 同比 环比

大臭 2013-10-25 04:51:53
有现成 sql server 的存储过程来实现,但是贴到oracle里面完全出错了,


oracle 里面 如何写 ?

这是 sql的:


DECLARE @var_sql1 VARCHAR(max),@var_sql2 VARCHAR(max),@var_sql3 VARCHAR(max),@var_sql4 VARCHAR(max),@var_group VARCHAR(200) ,
@var_parm1 VARCHAR(max),@var_parm2 VARCHAR(max),
@var_parm3 VARCHAR(max),@var_group1 VARCHAR(200),@date_lyearbegin DATETIME,
@date_lyearend DATETIME,@date_lmonthbegin DATETIME,@date_lmonthend DATETIME

--参数解析


--同期的时间

SET @date_lyearbegin = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.dsate_out,120) >= ',@var_parm)+20,10) AS DATETIME))
SET @date_lyearend = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.dsate_out,120) <= ',@var_parm)+20,10) AS DATETIME))

--环比的时间
SET @date_lmonthbegin = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.dsate_out,120) >= ',@var_parm)+20,10) AS DATETIME))
SET @date_lmonthend = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.dsate_out,120) <= ',@var_parm)+20,10) AS DATETIME))

--同期的参数
SET @var_parm2 =SUBSTRING(@var_parm,0,charindex('a.dsate_out,120) >= ',@var_parm)+20) +convert(varchar(10),@date_lyearbegin,120)+''' '
+ SUBSTRING(@var_parm,charindex('a.dsate_out,120) >= ',@var_parm)+32,LEN(' and convert(varchar(10),a.dsate_out,120) <= ')+1) +convert(varchar(10),@date_lyearend,120) + ''' ' + SUBSTRING(@var_parm,charindex('a.dsate_out,120) <= ',@var_parm)+32,999)

--环比的参数
SET @var_parm3 =SUBSTRING(@var_parm,0,charindex('a.dsate_out,120) >= ',@var_parm)+20) +convert(varchar(10),@date_lmonthbegin,120) +''' '
+ SUBSTRING(@var_parm,charindex('a.dsate_out,120) >= ',@var_parm)+32,LEN(' and convert(varchar(10),a.dsate_out,120) <= ')+1) +convert(varchar(10),@date_lmonthend,120) + ''' ' + SUBSTRING(@var_parm,charindex('a.dsate_out,120) <= ',@var_parm)+32,999)
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
写一个简单的例子 大致就这样了

with t1 as
(
     select '001' item,2 qty,date'2012-01-01' dt from dual union all
     select '002' item,2 qty,date'2012-02-01' dt from dual union all
     select '003' item,3 qty,date'2012-03-01' dt from dual union all
     select '001' item,5 qty,date'2013-01-01' dt from dual union all
     select '002' item,4 qty,date'2013-02-01' dt from dual union all
     select '003' item,6 qty,date'2013-03-01' dt from dual union all
     select '001' item,1 qty,date'2014-01-01' dt from dual
)

select item,qty,
       lag(qty) over(order by dt) s_qty,
       lag(qty) over(partition by item,to_char(dt,'mm') order by to_char(dt,'yyyy')) h_qty
from t1

     item    qty  s_qty  h_qty   
----------------------------------------
1	001	2		
2	002	2	2	
3	003	3	2	
4	001	5	3	2
5	002	4	5	2
6	003	6	4	3
7	001	1	6	5

  • 打赏
  • 举报
回复
引用 4 楼 nov25th 的回复:
[quote=引用 3 楼 HJ_daxian 的回复:] 通过当前lag() over()函数 来实现当前值与一值的比较 同期lag() over(order by item) 环比lag() over(partition by 分组字段 order by item)
谢谢 不过我是想把 同期的数值取出来 [/quote] 上面说的函数 就是取出数据呀
forgetsam 2013-10-28
  • 打赏
  • 举报
回复
1 写存储过程完成 把PL/SQL语法学完,不要想着直接改, 2 直接用窗口函数搞定,如楼上
大臭 2013-10-25
  • 打赏
  • 举报
回复
引用 3 楼 HJ_daxian 的回复:
通过当前lag() over()函数 来实现当前值与一值的比较 同期lag() over(order by item) 环比lag() over(partition by 分组字段 order by item)
谢谢 不过我是想把 同期的数值取出来
  • 打赏
  • 举报
回复
通过当前lag() over()函数 来实现当前值与一值的比较 同期lag() over(order by item) 环比lag() over(partition by 分组字段 order by item)
大臭 2013-10-25
  • 打赏
  • 举报
回复
我取出来的数据 item qty qty同期 qty当年上月(环比) 001 2 002 2 003 3 我想查 001 002 003 的同期 环比
大臭 2013-10-25
  • 打赏
  • 举报
回复
查了一下 很多函数 都需要替换 to_char charindex 都不一样

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧