要设置为下一行的动态列值';这是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

我是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      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
我的条件如下:

  • ID和CrLmt是组合,其后续行在此ID CrLmt组合下
  • 对于每个ID、CrLmt组合,CrLmt将分配到Prev_Bal列中,其余行将进行计算
  • 根据“买入/卖出类型”列,将添加或减去“金额”和“上一余额”中的值,并将结果值显示在“新建(动态)”列中
  • 如果类型为“卖出”,则PrevBal中的值应减去金额列值;如果类型为“买入”,则PrevBal中的值应与金额列值相加,结果值应显示在相应行的NewBal(动态)列中
  • 第1行的NewBal列中获得的值应显示在第2行的Prev_Bal列中,以便进行第2行的计算,依此类推
  • 如果NewBal列中出现任何负值,则需要进行下一次计算

  • 我尝试使用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,现在好点了吗?所有的东西都在一个表中吗?或者您是否有一个包含您的信用额度的表格,以及一个包含涉及信用额度表的交易的表格?请阅读-总结是,这不是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。这是一个很好的需求陈述,但我认为它对于堆栈溢出来说太宽泛了。普通读者中有一种观点认为,我们应该鼓励海报做出切实的努力来解决他们的问题,而不是一开始就把问题告诉我们。如果已经做了大量的工作或研究,请在中编辑,包括任何未完成的查询,否则请自己尝试。