要设置为下一行的动态列值';这是Oracle中的另一个列值
我是Oracle的新手,希望形成Oracle查询:要设置为下一行的动态列值';这是Oracle中的另一个列值,oracle,dynamic,Oracle,Dynamic,我是Oracle的新手,希望形成Oracle查询: Id CrLmt Type Unit Price Amount Prev_bal NewBal 5-00001 100000 Sell 100 150 15000 100000 85000 Buy 75 600 45000 85000 130000 Buy
Id CrLmt Type Unit Price Amount Prev_bal NewBal
5-00001 100000 Sell 100 150 15000 100000 85000
Buy 75 600 45000 85000 130000
Buy 85 550 46750 130000 176750
Sell 60 1000 60000 176750 116750
5-00002 90000 Sell 100 400 40000 90000 50000
Buy 550 300 165000 50000 215000
Sell 300 1000 300000 215000 -85000
我的条件如下:
我尝试使用LAG函数获取以前的值,但不知道如何在运行时获取动态列(NewBal)的值。这里有一个小示例,您必须适应当前的结构。您需要在您的交易中为金额的订单条款指定一个日期 您所需要的只是一个运行金额,您可以将新的\u余额的信用额度添加到该金额中,也可以将旧的\u余额的前一行添加到该金额中
--TEST DATA
CREATE TABLE credit_limit ( id varchar2(10), crlmt number );
CREATE TABLE transactions (transaction_type varchar2(4), unit number, price number, amount number, crlmt_id varchar2(10), date_transaction date );
INSERT INTO credit_limit values ('5-00001',100000);
INSERT INTO credit_limit values ('5-00002',90000);
INSERT INTO transactions values ('Sell',100,150,15000,'5-00001',sysdate-4);
INSERT INTO transactions values ('Buy',75,600,45000,'5-00001',sysdate-3);
INSERT INTO transactions values ('Buy',85,550,46750,'5-00001',sysdate-2);
INSERT INTO transactions values ('Sell',60,1000,60000,'5-00001',sysdate-1);
INSERT INTO transactions values ('Sell',100,400,40000,'5-00002',sysdate-3);
INSERT INTO transactions values ('Buy',550,300,165000,'5-00002',sysdate-2);
INSERT INTO transactions values ('Sell',300,1000,300000,'5-00002',sysdate-1);
--The query
select cr.id, cr.crlmt, tr.transaction_type, tr.unit, tr.price, tr.amount,
NVL(cr.crlmt + SUM(tr.amount*decode(tr.transaction_type,'Sell',-1,'Buy',1))
OVER (partition by cr.id order by cr.id, tr.date_transaction
rows between unbounded preceding and 1 preceding ),Cr.crlmt) old_bal,
cr.crlmt + SUM(tr.amount*decode(tr.transaction_type,'Sell',-1,'Buy',1))
OVER (partition by cr.id order by cr.id, tr.date_transaction
rows between unbounded preceding and current row ) new_bal
from
credit_limit cr
JOIN
transactions tr
ON cr.id=tr.crlmt_id
order by cr.id, tr.date_transaction
结果:
ID CRLMT TRAN UNI PRICE AMOUNT OLD_BAL NEW_BAL
5-00001 100000 Sell 100 150 15000 100000 85000
5-00001 100000 Buy 75 600 45000 85000 130000
5-00001 100000 Buy 85 550 46750 130000 176750
5-00001 100000 Sell 60 1000 60000 176750 116750
5-00002 90000 Sell 100 400 40000 90000 50000
5-00002 90000 Buy 550 300 165000 50000 215000
5-00002 90000 Sell 300 1000 300000 215000 -85000
你能格式化你的数据吗?JRG,现在好点了吗?所有的东西都在一个表中吗?或者您是否有一个包含您的信用额度的表格,以及一个包含涉及信用额度表的交易的表格?请阅读-总结是,这不是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。这是一个很好的需求陈述,但我认为它对于堆栈溢出来说太宽泛了。普通读者中有一种观点认为,我们应该鼓励海报做出切实的努力来解决他们的问题,而不是一开始就把问题告诉我们。如果已经做了大量的工作或研究,请在中编辑,包括任何未完成的查询,否则请自己尝试。