sql >> データベース >  >> RDS >> Mysql

前の残高行に基づいて合計を更新します

    ここに、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)
    


    1. PostgreSQLのpggemをUbuntuにインストールするにはどうすればよいですか?

    2. Rで分析するためにMySQLで大規模なデータベースを設定する

    3. OracleSQLで日付関数を操作する方法

    4. id列のキー値を使用してMySQLからPHP配列を生成します