0

トランザクション テーブルにある金額を追加しようとしていますが、トランザクションを逆の順序で、それらが属するローンでグループ化して追加する必要があります。いくつかの例を挙げましょう:

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 列に合計されているため、各ローンの最後のトランザクションには、同じローンのトランザクションの合計が含まれています。

今....私が実際に必要としているのは、合計を逆の順序で実行するためのものです。つまり、各ローンの同じトランザクションの場合、合計は同じ結果になりますが、各ローンの最後のトランザクションから最初のトランザクションまでの合計を計算する必要があります。

私は次のことを試しましたが、役に立ちませんでした (最後のクエリと同じクエリですが、FROM トランザクション テーブルに Order By DESC を使用しています)。

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 テーブルの注文列です...

前のクエリを使用すると、最初のクエリで取得したのと同じ結果が得られるので、何かが欠けているに違いないと思います。私が必要とするのは、次のような結果を得ることです:

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
|      |         |            |         |           |

ご覧のとおり、各ローン ID の合計は同じ最終結果になりますが、トランザクションの合計は逆の順序で行われます...

この混乱がすべて解消されることを願っています...どうすればそのような結果を達成できますか?

4

1 に答える 1

1

あなたは非常に近いように見えます... 2 つの小さな調整があると思います。まず、集計 (合計、最小、最大、平均など) を行っていないため、外側の GROUP BY を使用しないでください。次に、トランザクション テーブルをクエリするときは、最初にローン ID、次に日付の降順で並べ替えます。このようにして、すべてのローン ID が適切な順序でグループ化されますが、各ローン内では、降順で並べ替えられます。探している。また、現在の記録を次の記録と比較できるように、蓄積した後に @prevLoan を調整します。@変数をゼロから開始しているため、最初の実行時に最初のローン 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
于 2013-07-03T03:03:33.350 に答える