MySQL查询以计算产品ID库存库存水平的增量/减量的余额

时间:2012-11-28 16:53:34

标签: mysql

我有一个表'log',我正在跟踪库存变化。我使用信用来表示增加库存和借记以表示减少(我认为从会计原则来看,这是倒退的,但这是客户所希望的)。

我需要计算每个产品的借方和贷方余额(由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';

我有fiddle here

问题在于,当我取出where子句时,计算没有考虑到它只应该分别对每组UPC代码进行操作。

经过一番搜索,我遇到了this question,答案看起来与我可能需要的类似,但是,它与MySQL无关,而与SQL Server有关。另外,我不确定结果是我上面提到的日志/跟踪格式。具体来说,我想避免的是在每一行显示最终的平衡。如果库存中有999个产品,之后有4个减量,则库存中有995个,那么表示记录减量的每个记录不应显示995的计算余额,而是第一个减量日志应显示结果余额998,第二个应该显示997等。

---编辑---

有没有办法在不使用变量的情况下实现这一目标?此外,是否可以按时间戳排序日志,以便产品全部混合,而不是一起订购?

1 个答案:

答案 0 :(得分: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