我已经创建了一个表,并使用此查询插入一些虚拟数据:

  CREATE TABLE transaction (
  idtransaction INT NOT NULL AUTO_INCREMENT,
  idproduct INT NOT NULL,
  quantity INT NOT NULL,
  PRIMARY KEY (idtransaction));

INSERT INTO transaction (idproduct, quantity) VALUES
(1, 100),
(1, 200),
(2, 120),
(3, 300),
(2, 200),
(2, 200),
(1, 300);


我想得到这样的表结果:

|idtransaction| idproduct | quantity | saldo
    1               1         100       100
    2               1         100       200
    3               2         120       120
    4               3         300       300
    5               2         200       320
    6               2         200       520
    7               1         300       500


我创建了这样的查询:

SELECT  idtransaction,
        idproduct,
        quantity,
       (@saldo := @saldo + quantity) as saldo
FROM    transaction
LEFT JOIN
    (select @saldo :=0) as s on 1=1;


但是,对所有idproduct计算saldo历史记录的结果。

如何获取每个idproduct的“ saldo”历史记录?

最佳答案

您需要按idproduct排序数据,然后在@saldo更改时重置idproduct

如果要按idtransaction排序的最终结果,请将带有运行总计的查询放在子查询中,然后对它应用新的顺序。

SELECT *
FROM (
    SELECT idtransaction, idproduct, quantity,
            @saldo := IF(idproduct = @lastproduct, @saldo + quantity, quantity) AS saldo,
            @lastproduct := idproduct
    FROM (SELECT *
          FROM transaction
          ORDER BY idproduct, idtransaction) AS t
    CROSS JOIN (SELECT @saldo := 0, @lastproduct = NULL) AS vars) AS x
ORDER BY idtransaction


DEMO

关于mysql - 每个特定ID的MySQL用户定义变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35327873/

10-11 03:14