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,第二个应该显示 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 回答