我有以下两个表:
表1
item_id, sent_from, received_by, month, value
表2
item_id, sender, value, month
sent_from,received_by,sender的值是相同的类型和格式。 数据如下:
表1
values ('1234','A1111','K0000',1,5)
values ('1234','K0000','K0000',2,5)
values ('1234','K0000','Z0000',3,10)
表2
values ('1234','A1111',5,1)
values ('1234','K0000',10,2)
values ('1234','Z0000',20,3)
我试图在table1值和table2中从月份到月份的值之间进行协调。例如: table1中第3个月的值应为10,这与表2中第3 - 2月值之间的差值相同。所以20 - 10 = 10.然后10 - 5 = 5然后5 - 0应该是5,依此类推。下面的impact_value应该与table1中的值相同。
以下是我的代码,但它没有正常工作,也没有计算正确的值:
select sls.item_id,
sls.sent_from,
sls.received_by,
sum(case when prd.sender = sent_from then -1 * prd.value
else prd.value
end) impact_value,
sls.mnth
from table2 prd
inner join tabl1 sls on (prd.item_id = sls.item_id
and (prd.sender = sls.sent_from
or (prd.sender = sls.received_by
)))
group by sls.item_id,
sls.sent_from,
sls.received_by,
sls.mnth;
但是,impact_value字段没有填充正确的值,如逻辑中那样。
修改
将以下内容插入 table1 :
values ('1234','K0000','Z0005',4,40)
values ('1234','BBBBB','ZZZZZ',4,60)
并将以下内容插入 table2 :
values ('1234','K0000',60,4)
values ('1234','BBBBB',120,4)
答案 0 :(得分:0)
使用分析或窗口函数引导可以帮助您获得所需的结果
select t.*, lead(value) over (order by item_id, month) lead_value from table2 t;
以上查询返回如下结果,您可以在连接中将其用作子查询:
1234 A1111 5 1 10
1234 K0000 10 2 20
1234 Z0000 20 3(NULL)
以下是获取输出10,5,5:
的查询select t.*, value - nvl(lead_value, 0) from (select t.*, lead(value) over (order by item_id, month desc) lead_value from table2 t) t;