ここに、1つのユーザー変数を使用したソリューションがあります。
結果は、完全なデモを添付して検証されます。
SQL:
-- data preparation for demo
create table tbl(Name char(100), id int, Col1 int, Col2 int, Col3 char(20), Col4 char(20), Total int, Balance int);
insert into tbl values
('Row1',1,6,1,'A','Z',0,0),
('Row2',2,2,3,'B','Z',0,0),
('Row3',3,9,5,'B','Y',0,0),
('Row4',4,12,8,'C','Y',0,0);
SELECT * FROM tbl;
-- Query needed
SET @bal = 0;
UPDATE tbl
SET
Total = CASE WHEN Col3 = 'A' and Col4 <> 'Z'
THEN Col1+Col2
WHEN Col3 = 'B' and Col4 <> 'Z'
THEN Col1-Col2
WHEN Col3 = 'C' and Col4 <> 'Z'
THEN Col1*Col2
ELSE 0 END,
Balance = (@bal:[email protected] + Total);
SELECT * FROM tbl;
出力(期待どおり):
mysql> SELECT * FROM tbl;
+------+------+------+------+------+------+-------+---------+
| Name | id | Col1 | Col2 | Col3 | Col4 | Total | Balance |
+------+------+------+------+------+------+-------+---------+
| Row1 | 1 | 6 | 1 | A | Z | 0 | 0 |
| Row2 | 2 | 2 | 3 | B | Z | 0 | 0 |
| Row3 | 3 | 9 | 5 | B | Y | 0 | 0 |
| Row4 | 4 | 12 | 8 | C | Y | 0 | 0 |
+------+------+------+------+------+------+-------+---------+
4 rows in set (0.00 sec)
mysql> -- Query needed
mysql> SET @bal = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE tbl
-> SET
-> Total = CASE WHEN Col3 = 'A' and Col4 <> 'Z'
-> THEN Col1+Col2
-> WHEN Col3 = 'B' and Col4 <> 'Z'
-> THEN Col1-Col2
-> WHEN Col3 = 'C' and Col4 <> 'Z'
-> THEN Col1*Col2
-> ELSE 0 END,
-> Balance = (@bal:[email protected] + Total);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 4 Changed: 2 Warnings: 0
mysql>
mysql> SELECT * FROM tbl;
+------+------+------+------+------+------+-------+---------+
| Name | id | Col1 | Col2 | Col3 | Col4 | Total | Balance |
+------+------+------+------+------+------+-------+---------+
| Row1 | 1 | 6 | 1 | A | Z | 0 | 0 |
| Row2 | 2 | 2 | 3 | B | Z | 0 | 0 |
| Row3 | 3 | 9 | 5 | B | Y | 4 | 4 |
| Row4 | 4 | 12 | 8 | C | Y | 96 | 100 |
+------+------+------+------+------+------+-------+---------+
4 rows in set (0.00 sec)