用于分发付款的Oracle SQL查询

时间:2014-06-26 19:37:55

标签: sql oracle billing oracle-analytics

我正在尝试在多个发票交易中实现付款分配,这是批处理过程的一部分。发票和付款交易保存在同一个表中,作为交易记录。

所以对于例如。我们在交易记录表中有:

ID,   USER ,  TYPE     , AMOUNT   
1     Mr. X   Invoice      1000   
2     Mr. X   Invoice      2000   
3     Mr. X   Invoice      1000   
4     Mr. X   Payment     -3000   
5     Mr. X   Payment      -500   

我正在寻找一个查询,将为此用户支付3500总额,从第一张发票开始,将付款分配到每张发票并将其转储到新表中。

新表的最终结果如下所示。

ID    User ,  TYPE     ,   AMOUNT   , AMOUNT_PAID
1     Mr. X   Invoice        1000            1000
2     Mr. X   Invoice        2000            2000
3     Mr. X   Invoice        1000            500

我试图避免在PL / SQL块中使用循环。 任何评论都非常感谢!

1 个答案:

答案 0 :(得分:2)

所以这个解决方案使用两个分析函数。在内部查询中,它使用分析SUM()来跟踪发票金额的滚动总计。在外部查询中,当付款总额不足时,它使用LAG()来获取先前的发票总额。

select id
       , username
       , amount
       , case when tot_amount >= rolling_pay
              then amount
         else
              tot_amount - lag(rolling_pay) over (order by id)
         end as amount_paid
from (
   with inv as (select id
                         , username
                         , amount 
                 from transactions
                 where type = 'Invoice' )
         , pay as ( select username
                            , abs(sum(amount)) as tot_amount 
                 from transactions
                 where type = 'Payment'
                 group by username )
    select inv.id
           , inv.username
           , inv.amount
           , pay.tot_amount
           , sum(inv.amount) over (partition by inv.username order by inv.id) as rolling_pay
    from inv join pay 
         on inv.username = pay.username
    order by inv.username, inv.id
  )

注意:我总结了付款,因为每个商家密钥不止一个。

这是inevitable SQL Fiddle证明这会产生预期的结果。