MySQL 每个特定 ID 的用户定义变量
MySQL User Defined Variable for every spesific ID
我已经创建了一个 table 并使用此查询插入了一些虚拟数据:
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);
我想得到这样的 table 结果:
|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;
但是,saldo 历史的结果是针对所有 idproduct 计算的。
如何获取每个 idproduct 的 'saldo' 历史记录?
您需要按 idproduct
对数据进行排序,然后在 idproduct
更改时重新设置 @saldo
。
如果您想要按 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
我已经创建了一个 table 并使用此查询插入了一些虚拟数据:
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);
我想得到这样的 table 结果:
|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;
但是,saldo 历史的结果是针对所有 idproduct 计算的。
如何获取每个 idproduct 的 'saldo' 历史记录?
您需要按 idproduct
对数据进行排序,然后在 idproduct
更改时重新设置 @saldo
。
如果您想要按 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