2

在庫の変更を追跡する「ログ」テーブルがあります。在庫の増加を示すためにクレジットを使用し、減少を示すためにデビットを使用しています (会計原則からすると、これは逆ですが、クライアントが望んでいることです)。

現在の合計のように、各製品 (upc フィールドで示される) の借方と貸方の残高を計算する必要があります。つまり、ログをタイムスタンプ (または既定の順序) で並べ替えて、毎回製品に増分または減分がある場合、その特定の増分または減分によるその時点での結果の在庫残高を表示します。

このクエリを使用してこれを実証できましたが、where 句の条件として UPC コードを追加して特定の製品を選び出すことによってのみです。

SELECT 
    l.id,
    l.upc,
    l.credit,
    l.debit,
    @bal := @bal + credit - debit AS balance,
    l.timestamp
FROM log l, (SELECT @bal := 0) b
where upc = '677797003424';

ここにフィドルがあります

問題は、where 句を削除すると、UPC コードの各セットを個別に処理することだけが想定されている計算が考慮されないことです。

いくつか検索した後、この質問に出くわし、答えは私が必要とするものに似ているように見えますが、これは MySQL ではなく SQL Server に関するものです。また、結果が上記のログ/追跡形式になるかどうかもわかりません。特に避けたいのは、すべての行で最終的な残高を表示することです。製品の在庫が 999 個あり、4 回の減少後に 995 個の在庫がある場合、減少をログに記録することを示す各レコードは、計算された 995 の残高を表示するのではなく、最初の減少ログは結果の残高を表示する必要があります。 998 のうち、2 番目は 997 などを表示する必要があります。

- - 編集 - -

変数を使わずにこれを達成する方法はありますか? また、ログをタイムスタンプでソートして、製品を一緒に注文するのではなく、すべて混同することは可能ですか?

4

1 に答える 1

0

これはうまくいきますか?

SELECT 
    l.id,
    l.upc,
    l.credit,
    l.debit,
    @bal := IF(@previous=l.upc, @bal + l.credit - l.debit, l.credit - l.debit) AS balance,
    @previous := l.upc,
    l.timestamp
FROM `log` l, (SELECT @bal := 0, @previous='') b
ORDER BY l.upc ASC, l.timestamp ASC

編集:

@bal で負の値を取得するには、次のようにします。

SELECT 
    l.id,
    l.upc,
    l.credit,
    l.debit,
    @bal := IF(@previous=l.upc, @bal + l.credit - l.debit, l.credit - l.debit) AS balance,
    @previous := l.upc,
    l.timestamp
FROM `log` l, (SELECT @bal := CAST(0 AS DECIMAL), @previous='') b
ORDER BY l.upc ASC, l.timestamp ASC
于 2012-11-28T17:19:54.797 に答える