用于分配付款的 Oracle SQL 查询

Posted

技术标签:

【中文标题】用于分配付款的 Oracle SQL 查询【英文标题】:Oracle SQL Query for distributing payments 【发布时间】:2014-06-26 19:37:54 【问题描述】:

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

例如。我们的交易登记表中有:

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 块中使用循环。 任何 cmets 都非常感谢!

【问题讨论】:

对于给定用户(或您的实际分组密钥是什么)是否可以进行多次付款? 是的,一个用户可以支付超过 1 次付款。因此,我们正在尝试将付款总和分配给各个发票。如果付款超过,最后一张发票将被多付的金额多付。我对帖子进行了一些编辑以表示多次付款。 【参考方案1】:

所以这个解决方案使用了两个分析函数。在内部查询中,它使用分析 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 证明这会产生所需的结果。

【讨论】:

哇!那工作完美无缺。我需要花一些时间来研究分析函数,以便我可以调整它来处理多付的情况。非常感谢! 这对我在 Postgresql 中同样适用...谢谢。

以上是关于用于分配付款的 Oracle SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL 查询中一个字段的值用于 Oracle Apex 上另一个字段的值列表?

分配数量的 Oracle SQL 查询

Oracle 分页查询rownum的用法

用于 oracle 子查询的 Pyspark sql

用于 Oracle 查询开发的 SQL 工具和 Toad IDE 的替代方案

用于连接 Oracle 中多行的列值的 SQL 查询