我有一张表,上面有我的发票号和付款金额,例如:
invoice 1234 1000
我有另一个表,其中包含金额分配到的作业,例如:
Job 1 500 Invoice 1234
Job 2 200 Invoice 1234
Job 3 300 Invoice 1234
如何让 1000 正确分配到下面的行。工作分配上可能有一行或多于上面显示的内容...仅取决于发票。
好吧,让我假设您使用的是 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)。在其他情况下,您需要进行自联接才能获得此结果。