Update the total based on the previous row of balance

后端 未结 4 2071
难免孤独
难免孤独 2021-01-22 13:05

This is the database data.

Name   id  Col1  Col2  Col3 Col4 Total  Balance
Row1   1    6     1     A     Z     -      - 
Row2   2    2     3     B     Z     -            


        
4条回答
  •  终归单人心
    2021-01-22 13:48

    Here comes a solution with assist of one user variable.

    The result is verified with the full demo attached.

    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:=@bal + Total);
    SELECT * FROM tbl;
    

    Output(as expected):

    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:=@bal + 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)
    

提交回复
热议问题