计算从一个值移动到另一个sql的列的差异

时间:2015-12-02 16:05:35

标签: sql oracle

我有以下两个表:

表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)

1 个答案:

答案 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;