2

私は2つの同様のテーブル(1つは請求書用、もう1つは支払い用)を持っています.現在、両方のデータを混合したユニオンをユーザーに示しています..

Table Bills                             
CustomerId  Amount                      
1           100                        
2           100                        
1           100                        
2           100

Table Payments
CustomerId  Amount
1           100
2           100
1           100

現在、ユーザーは次の情報を確認できます

From Customer 1
Type    CustomerId   Amount
B       1            100
P       1            -100
B       1            100
P       1            -100
TOTAL 0

From Customer 2
Type    CustomerId   Amount
B       1            100
P       1            -100
B       1            100
Total 100

UNIONステートメントを使用すると、すべてが正常に機能します

現時点では、ユーザーがレコードを見ているときにバランスを維持できるように、各レコードに部分的なバランスを表示する必要があります..

このように... (望ましい)

From Customer 1
Type    CustomerId   Amount    Partial
B       1            100       100
P       1            -100      0
B       1            100       100
P       1            -100      0

私はすでに @Partial := @Partial + Amount のような変数を使用しようとしましたが、最初の部分 (請求書) を最初に合計し、次に残り (支払い) を合計するようです...このように...

From Customer 1
Type    CustomerId   Amount    Partial
B       1            100       100
P       1            -100      200
B       1            100       200
P       1            -100      100

最初に請求書からすべてを合計してから減算を開始するようです...誰もそれを解決する方法を知っていますか?

** * ** * // 更新 // * ** * ****

ここで元のクエリ...

(「Bill」を cType 、b.type、b.tal、「Customer」、b.number、b.date、b.subtot、b.tax、IF(b.type='CA' または b.type= として選択) 'CB' or b.type='CC' or b.type='CX',b.total*-1,b.total) as total FROM bills b WHERE b.idcustomer='000140') UNION ALL (SELECT ' Payment' as cType, 'CO' , '1' , '' , c.idcash , c.date , 0 ,0 , -c.amount FROM cash c WHERE c.idcustomer='000140' and ( c.type=' CO' または c.type='DM') ) 日付順 asc;

これはこのようなものをもたらします

請求書 FX 1 顧客 9 2011-02-25 0.00 0.00 100.00

支払い CO 1 37 2011-03-04 0.00 0.00 -100.00

請求書 FX 1 顧客 616 2011-03-23 0.00 0.00 100.00

支払い CO 1 751 2011-04-12 0.00 0.00 -100.00

請求書 FX 1 顧客 1267 2011-04-27 0.00 0.00 100.00

支払い CO 1 1157 2011-05-10 0.00 0.00 -100.00

請求書 FX 1 顧客 1974 2011-05-26 0.00 0.00 100.00

支払い CO 1 1654 2011-06-08 0.00 0.00 -100.00

次に、patiarsを合計しようとすると...次のコードを使用します

@running_total=0 を設定します。(「Bill」を cType 、b.type、b.tal、「Customer」、b.number、b.date、b.subtot、b.tax、IF(b.type='CA' または b.type= として選択) 'CB' or b.type='CC' or b.type='CX',b.total*-1,b.total) as total, ( @running_total := @running_total + total) AS RunningTotal FROM bills b WHERE b.idcustomer='000140') UNION ALL ('Payment' を cType, 'CO' , '1' , '' , c.idcash , c.date , 0 ,0 , -c.amount, ( @running_total : = @running_total-c.amount) AS RunningTotal FROM 現金 c WHERE c.idcustomer='000140' and ( c.type='CO' or c.type='DM') ) 日付順 asc;

結果...

請求書 FX 1 顧客 9 2011-02-25 0.00 0.00 100.00 100.00

支払 CO 1 37 2011-03-04 0.00 0.00 -100.00 1905.00

請求書 FX 1 顧客 616 2011-03-23 0.00 0.00 100.00 200.00

支払い CO 1 751 2011-04-12 0.00 0.00 -100.00 1805.00

請求書 FX 1 顧客 1267 2011-04-27 0.00 0.00 100.00 300.00

支払い CO 1 1157 2011-05-10 0.00 0.00 -100.00 1705.00

ご覧のとおり、最初に請求書からすべてを合計し、次に支払いから減算を開始するようです...

4

1 に答える 1

0

以下は、レコードを並べ替えるためのタイムスタンプがあると仮定して、MySQL でこれを行う唯一の方法です。適度な量のデータがある場合でも、これは非効率的であることが判明する可能性があります。

select t.*,
       ((select sum(amount)
         from bills b
         where b.customerId = t.customerId and
               b.datetime <= t.datetime
        ) -
        (select sum(amount)
         from payments p
         where p.customerid = t.customerid and
               p.datetime <= t.datetime
        )
       ) as balance
from ((select 'B' as type, customerid, amount, datetime from bills b) union all
      (select 'P', customerid, amount, datetime from payments p)
     ) t
于 2012-10-23T19:54:13.263 に答える