2013-07-03 36 views
0

我正在嘗試添加生活在交易表中的金額,但必須按照相反的順序完成交易,並按照他們所屬的貸款進行分組。讓我把一些例子:與貸款有關的交易的MySQL總金額相反

Transactions 
tid loanid amount entrydate 
------------------------------------ 
1  1   1,500  2013-06-01 
2  2   1,500  2013-06-01 
3  1   1,000  2013-06-02 
4  3   2,300  2013-06-04 
5  5   2,000  2013-06-04 
6  1   1,100  2013-06-07 
7  2   1,000  2013-06-09 
|  |   |   | 


Loans 
loanid 
------ 
1 
2 
3 
4 
5 
| 

正如你所看到的,有對的LoanID 4沒有交易,只是明確指出,有針對貸款存在的交易沒有義務的地步。

現在,我試圖實現的是總結每筆貸款交易的金額。這第一種方法實現這一點:

SELECT tr.tid, 
     l.loanid, 
     tr.entrydate, 
     tr.amount, 
     @prevLoan:=l.loanid prevloan, 
     @amnt:=if(@prevLoan:=l.loanid, @amnt+tr.amount, tr.amount) totAmnt 

FROM (SELECT * FROM Transactions) tr 

JOIN (SELECT @prevLoan:=0, @amnt:=0) t 

JOIN Loans l 
    ON l.loanid = tr.loanid 


GROUP BY l.loanid, tr.tid 

其實現是這樣的:

tid loanid entrydate amount prevloan totAmnt 
----------------------------------------------------------- 
1  1   2013-06-01 1,500  1   1,500 
3  1   2013-06-02 1,000  1   2,500 
6  1   2013-06-07 1,100  1   3,600 <-- final result for loanid=1 
2  2   2013-06-01 1,500  2   1,500 
7  2   2013-06-09 1,000  2   2,500 <-- final result for loanid=2 
4  3   2013-06-04 2,300  3   2,300 <-- final result for loanid=3 
5  5   2013-06-04 2,000  5   2,000 <-- final result for loanid=5 
|  |   |   |   |   | 

正如你所看到的,對於每個借款,屬於它的交易量越來越在totAmnt SUMED起來列,所以每筆貸款的最後一筆交易具有同一筆貸款的交易總額。

現在....我真正需要的是得到的東西是以相反的順序完成的。我的意思是,對於每筆貸款的同一筆交易,這筆款項仍然會得到相同的結果,但我需要從每筆貸款的最後一筆交易到第一筆貸款完成這筆款項。

我試過以下,但無濟於事(這是相同的查詢作爲最後一個,但一個ORDER BY DESC在FROM交易表):

SELECT tr.tid, 
     l.loanid, 
     tr.entrydate, 
     tr.amount, 
     @prevLoan:=l.loanid prevloan, 
     @amnt:=if(@prevLoan:=l.loanid, @amnt+tr.amount, tr.amount) totAmnt 

FROM (SELECT * FROM Transactions ORDER BY tr.entrydate DESC) tr 

JOIN (SELECT @prevLoan:=0, @amnt:=0) t 

JOIN Loans l 
    ON l.loanid = tr.loanid 


GROUP BY l.loanid, tr.tid 

我使用TR .entrydate因爲是一種比較熟悉的方式來說出訂單條件,而且這就是政策所說的有效訂單條件,tid可能會說些什麼,但entrydate是Transactions表的排序列...

使用previous查詢,我只是得到了與第一個查詢得到的結果相同的結果,所以我猜想在那裏必須丟失一些東西。我需要的是得到的結果如下:

tid loanid entrydate amount prevloan totAmnt 
----------------------------------------------------------- 
6  1   2013-06-07 1,100  1   1,100 
3  1   2013-06-02 1,000  1   2,100 
1  1   2013-06-01 1,500  1   3,600 <-- final result for loanid=1 
7  2   2013-06-09 1,000  2   1,000 
2  2   2013-06-01 1,500  2   2,500 <-- final result for loanid=2 
4  3   2013-06-04 2,300  3   2,300 <-- final result for loanid=3 
5  5   2013-06-04 2,000  5   2,000 <-- final result for loanid=5 
|  |   |   |   |   | 

正如你可以看到每個的LoanID總和得到相同的最終結果,但總和爲相反的順序進行的交易完成...

希望這一切都很明顯......我怎樣才能達到這樣的結果?

回答

1

你看起來非常接近...我認爲你有兩個小調整。首先,不要使用外部GROUP BY,因爲您沒有進行任何聚合(總和,最小值,最大值,平均值等)。其次,在查詢您的交易表時,只需按貸款編號FIRST,然後下降日期...這樣,所有貸款編號按照適當的順序組合在一起,但在每個貸款中,它們按您的順序降序排列尋找。此外,調整你的@prevLoan之後,你已經積累了,所以當前記錄可以與下一個比較。您正在啓動@variable爲零,因此它無論如何不會匹配第一次運行時的第一個貸款ID。最後,你甚至不需要加入貸款表,因爲交易表有貸款ID作爲比較測試的基礎。由於最內層查詢是按貸款排序的,然後輸入日期遞減,所以在外層查詢中不應再需要它。

SELECT 
     tr.tid, 
     tr.loanid, 
     tr.entrydate, 
     tr.amount, 
     @amnt := if(@prevLoan = tr.loanid, @amnt+tr.amount, tr.amount) totAmnt, 
     @prevLoan := tr.loanid prevloan 
    FROM 
     (SELECT * 
      FROM Transactions 
      ORDER BY loanid, entrydate DESC) tr 

     JOIN (SELECT @prevLoan := 0, 
        @amnt := 0) t 

備用解決方案?根據我的評論,它看起來像你想要高總數和縮小...這是否更接近?

SELECT 
     tr.tid, 
     tr.loanid, 
     tr.entrydate, 
     tr.amount, 
     trTotals.TotalLoans - if(@prevLoan = tr.loanid, @amnt, 0) as NewBal, 
     @amnt := if(@prevLoan = tr.loanid, @amnt+tr.amount, tr.amount) runningTotals, 
     @prevLoan := tr.loanid prevloan 
    FROM 
     (SELECT * 
      FROM Transactions 
      ORDER BY loanid, entrydate DESC) tr 

     JOIN (SELECT loanid, sum(amount) as TotalLoans 
       FROM Transactions 
       group by loanid) trTotals 
     on tr.loanid = trTotals.loanid 

     JOIN (SELECT @prevLoan := 0, 
        @amnt := 0) t 

Produces...      (Total Paid) (for reversing calc) 
tid loanid entrydate amount NewBal  Running Totals prevLoan 
6  1  2013-06-07 1100  3600  1100    1 
3  1  2013-06-02 1000  2500  2100    1 
1  1  2013-06-01 1500  1500  3600    1 
7  2  2013-06-09 1000  2500  1000    2 
2  2  2013-06-01 1500  1500  2500    2 
4  3  2013-06-04 2300  2300  2300    3 
5  5  2013-06-04 2000  2000  2000    5 
+0

哇...讓我試試看...... BTW,我被貸款編號分組,因爲我明白,這是必要做的總和,但也許我錯了。與貸款接洽我仍然需要今後對查詢進行調整,因爲loanid不會是我需要從貸款帳戶獲得的唯一信息。你認爲這會改變你的答案嗎?順便說一句,我用一個整數loanid來舉例說明,但實際上它可能是一個字符串,我認爲這並不重要,但也許它確實......? –

+1

@JavierNovoaC,通過加入實際的貸款表應該沒有額外的影響,只是用它來獲取額外的元素,如貸款帳戶,客戶等等。實際上並不需要下降但仍然按貸款分組的交易。 – DRapp

+0

好吧,它似乎沒有工作。它仍然給我與原始訂單中的交易相同的結果,而不是相反的結果:( –

相關問題