请帮忙。如何完成以下任务:
该表包含每日交易数据。目的是使用昨天的记录的计算值(在这3列中),将值更新/插入当天记录中的3列。我有最近40天的更新时间基于:
trunc(sysdate)-39 = calculated value of trunc(sysdate)-40
trunc(sysdate)-38 = calculated value of trunc(sysdate)-39
trunc(sysdate)-37 = calculated value of trunc(sysdate)-36
.
.
.
.
trunc(sysdate)= calculated value of trunc(sysdate)-1.
我的代码示例:
marge into
(select trans_date, store, item, reason, col1, col2, col3
from tb1 where tb1.trans_date = trunc(sysdate)) today
using
(select trans_date, store, item, reason, col1, col2, col3
from tb1
where tb1.trans_date = trunc(sysdate-1)) yesterday
when matched then
update set
(today.col1 = yesterday.col1 + 1
today.col2 = decode(yesterday.reason,today.reason,today.col2+1,1)
today.col3 = yesterday.trans_date)
WHEN NOT MATCHED THEN
INSERT (today.col1, today.col2, today.col3 )
VALUES (
1, 1,
(select max(trans_date) from tb1
where tb1.trans_date < trunc(sysdate)-1)
and tb1.store=today.store
and tb1.item=today.item);
请注意:每天的记录可能有以下重复。
今天:
trans_date store item reason col1 col2 col3 ***(expected values)***
14/04/14 999 100 'short supply' - - - ==> 2,2,13/04/14
14/04/14 999 100 'short supply' - - - ==> 2,2,13/04/14
14/04/14 998 101 'Damaged' - - - ==> 2,2,11/04/14
14/04/14 990 105 'Returned' - - - ==> 2,1,13/04/14
14/04/14 995 107 'Returned' - - - ==> 1,1,14/04/14
昨天:
trans_date store item reason col1 col2 col3
13/04/14 999 100 'short supply' 1 1 13/04/14
13/04/14 999 100 'short supply' 1 1 13/04/14
13/04/14 998 101 'Damaged' 1 1 11/04/14
13/04/14 990 105 'Transferred' 1 1 13/04/14
答案 0 :(得分:0)
如果需要,通常会创建一个存储过程。这会有所帮助
create or replace procedure SP_TEST
as
// declare your variables //
cursor c is select trans_date, store, item, reason, col1, col2, col3
from tb1 where tb1.trans_date = trunc(sysdate-1);
begin
for rec in c loop
// do your calculations //
select count(*) into v_v1 from tb1 where tb1.trans_date = trunc(sysdate)
if v_v1=0 then
// do insert
else
//do update
end if;
end loop;
exception
// exception part
end;
如果您不想重复,请在游标查询中使用DISTINCT或使用表中的约束
对于历史数据,请使用类似
的内容 create or replace procedure SP_TEST(P_DATE DATE)
as
// declare your variables //
cursor c is select trans_date, store, item, reason, col1, col2, col3
from tb1 where tb1.trans_date = trunc(P_DATE-1);
begin
for rec in c loop
// do your calculations //
select count(*) into v_v1 from tb1 where tb1.trans_date = trunc(P_DATE)
if v_v1=0 then
// do insert
else
//do update
end if;
end loop;
exception
// exception part
end;