2012-06-28 49 views
0

我有一个表,我的发票号码和付款金额,例如多行打破了下来:总共基于

invoice 1234 1000 

我有那个量被分配到的工作,例如另一个表:

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

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

+1

请问您能否重新解释最后一段。 – Sean

+1

请张贴一些示例数据和您的预期结果。 – Taryn

+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)。在其他情况下,您需要进行自我连接才能获得此结果。