2015-06-04 68 views
2

我有一個表supplier_account,它有五個coloumns supplier_account_id(pk),supplier_id(fk),voucher_no,借方和貸方。我想獲得由supplier_id分組的借方總數,然後減去voucher_no不爲空的行的貸方值。因此,對於每個後續行,借方總和的值會減少。我曾嘗試使用'with'子句。從分組結果中減去一行的值

with debitdetails as(
select supplier_id,sum(debit) as amt 
from supplier_account group by supplier_id 
) 
select acs.supplier_id,s.supplier_name,acs.purchase_voucher_no,acs.purchase_voucher_date,dd.amt-acs.credit as amount 
from supplier_account acs 
left join supplier s on acs.supplier_id=s.supplier_id 
left join debitdetails dd on acs.supplier_id=dd.supplier_id 
where voucher_no is not null 

但是這裏的借方值對於所有行都是相同的。在第一行減法後,我想在第二行得到結果,並從中減去下一個信用值。

我知道這可以通過使用臨時表。問題是我無法使用臨時表,因爲該過程用於使用Jasper Reports生成報告。

+0

您使用的術語「後續行」和「第一行」和「第二行「和」下一個「,但是沒有數據排序,那麼特定的行如何可以是」第一「,」第二「或」下一個「?如果你想積累金額,你將不得不更好地解釋這究竟是如何工作的。也許一些樣本數據和樣本預期輸出會幫助某人給你一個答案。 – Turophile

回答

1

你需要的是執行總計。與窗口功能的幫助下,最簡單的方式做到這一點:

with debitdetails as(
select id,sum(debit) as amt 
from suppliers group by id 
) 
select s.id, purchase_voucher_no, dd.amt, s.credit, 
dd.amt - sum(s.credit) over (partition by s.id order by purchase_voucher_no asc) 
from suppliers s 
left join debitdetails dd on s.id=dd.id 
order by s.id, purchase_voucher_no 

SQL Fiddle

結果:

| id | purchase_voucher_no | amt | credit | ?column? | 
|----|---------------------|-----|--------|----------| 
| 1 |     1 | 43 |  5 |  38 | 
| 1 |     2 | 43 |  18 |  20 | 
| 1 |     3 | 43 |  8 |  12 | 
| 2 |     4 | 60 |  5 |  55 | 
| 2 |     5 | 60 |  15 |  40 | 
| 2 |     6 | 60 |  30 |  10 |