2012-06-28 52 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)。在其他情況下,您需要進行自我連接才能獲得此結果。