基于总计将多个行分解为多行

时间:2012-06-28 19:06:10

标签: sql rows

我有一张包含发票号和付款金额的表格,例如:

invoice 1234   1000

我有另一张表,其中包含分配金额的作业,例如:

Job 1   500   Invoice 1234
Job 2   200   Invoice 1234
Job 3   300   Invoice 1234

如何让1000正确分发到下面的行。工作分配中可能有一行或多于上面显示的行...仅取决于发票。

1 个答案:

答案 0 :(得分:1)

好吧,我假设您使用的是Oracle,因为这在该数据库中最简单。

您需要的是累计金额,与付款金额相比。因此,我假设您要将付款应用于最早的发票。以下查询执行此操作:

select i.*,
       (case when cumAmount <= p.payment then Amount
             when cumAmount - i.Amount < p.payment then p.payment - (i.cumAmount - i.Amount)
             else 0
        end) as AppliedPayment
from (select p.InvoiceId, sum(p.payment) as payment
      from Payment p
      group by p.InvoiceId
     ) join
     (select i.*,
             sum(i.amount) over (partition by i.InvoiceId order by i.JobNum) as cumAmount
      from Invoices i
     ) i
     on p.InvoiceId = i.InvoiceId

因此,我们的想法是您从发票中创建累计金额总和。然后,将其与付款进行比较。当累计金额小于付款时,您可以应用整个发票金额。当累计金额远大于付款时,则无法应用任何内容。您有一个边界条件,您可能需要支付部分款项。

第一个子查询累计发票的所有付款,以避免重复。第二个子查询计算累计发票金额。

其他一些数据库直接支持累积和(SQL Server 2012)。在其他情况下,您需要进行自我联接才能获得此结果。