2017-12-20 11 views

答えて

0

をgur.com/pcwhp.png

FIFO in sql

sample私はあなたがExcelの溶液またはSQL 1を探しているなら、それはユニークなキーなしでSQLで作業するのは難しい原因を確認していません。すべてのトランザクションに固有のIDフィールドがあると仮定して、どのように進めるかを提案しようとします。

まずアカウントのすべての正の変更を計算します(これは解の一部になりますが、分かりやすくするために分割しています)。

SELECT 
    t.account, 
    SUM(t.debit) AS change_positive 
FROM 
    transactions AS t 
WHERE 
    t.debit > 0 
GROUP BY 
    t.account 

ここでは、払い戻し額の合計額を勘定別に記載します。この場合、(10 + 5 +20)

同様の操作を負債変更(負の変更)する必要がありますが、現行の操作(例: 2014年12月21日は-20、2014年12月25日は-55です。 debits_till_dateの価値がある場合は、payments_totalがその支払いをカバーしているかどうか、またはすでに支払いの対象となる債務が多すぎるかどうかを知ることができます。 (以前のものを含む)の合計クエリとしてSQLでは、それは次のようになります。あなたは最後の部分を削除した場合

SELECT 
    q.account, 
    q.date, 
    q.transaction_debit, 
    q.remainings_from_payments 
FROM 
    (
     SELECT 
      t.account, 
      t.date, 
      t.debit AS transaction_debit, 
      SUM(t2.debit) AS debits_till_date, 
      i.payments_total, 
      SUM(t2.debit) + i.payments_total AS remainings_from_payments 
     FROM 
      transactions AS t 
     LEFT JOIN transactions AS t2 ON t.account = t2.account AND t.date >= t2.date AND t2.debit < 0 
     LEFT JOIN (SELECT t.account, SUM(t.debit) AS payments_total FROM transactions AS t WHERE t.debit > 0 GROUP BY t.account) AS i ON t.account =  i.account 
     GROUP BY 
      t.account, t.date 
    ) AS q 
    WHERE 
     q.transaction_debit < 0 
     AND q.remainings_from_payments < 0 

「AND q.remainings_from_payments < 0」あなたがした後、すべての残ってどのくらいの支払いの見ることができるようになります否定的な取引。


SQLFiddle DEMO

+0

こんにちはStromoPL、クエリに感謝。それがworks.actually私はリンクhttp://www.sqlservercentral.com/articles/FIFO+Queues/145613/と同じソリューションを探してみてみましょう私はSQLのDB2を持っていると確信してどのように照らして質問を使用するリンク。私はトランザクションのための一意のIDを持っていません。唯一の識別子は、日付のクレジットとデビットの合計です。 –

+0

Chris、 "date"フィールドを使用して "id"を使用しないようにクエリを更新しました。アカウント内の日付が一意である限り有効です。私が提供したクエリはmySQL上でテストされましたが、これはかなり標準的なので、プレーンなSQLをサポートするすべてのデータベースで動作する必要があります(クエリから "テーブル"という名前のテーブルに名前を変更します) – StormoPL

+0

http://sqlfiddle.com/#! 9/49759d/1 –