【问题标题】:Sum of two columns by id to one field按 id 将两列总和到一个字段
【发布时间】:2013-12-04 04:00:35
【问题描述】:

我需要通过 id 将两列相加到一个具有相同 id 的字段

例如:我想要余额为income - expenses = balance

表事务:

=========================================================
|  id  | idBudget  |  expenses      ||      income      |
=====+========+===============+=====|=====+========+====|
|   1  |      2    |     10         ||        0         |  
|----+--------+---------------+-----||----+--------+----|
|   2  |      3    |     200        ||        0         |              
|----+--------+---------------+-----||----+--------+----|
|   3  |      2    |     1          ||     100          |  
|----+--------+---------------+-----||----+--------+----|
|   4  |      2    |     0          ||     1000         |              
|----+--------+---------------+-----||----+--------+----|

餐桌预算:

=====================================
|  idBudget        |  Balance       |
=====+========+===============+=====|
|     2            |     1090       |
|----+--------+---------------+-----|
|     3            |     -200       |
|----+--------+---------------+-----|

我厌倦了使用触发器,但我想我不知道如何实现它

【问题讨论】:

    标签: mysql sql codeigniter phpmyadmin


    【解决方案1】:
    CREATE TABLE starting_balance AS (SELECT * FROM budget);
    
    DROP TABLE budget;
    
    CREATE VIEW budget AS (
        SELECT
            sb.idBudget,
            sb.balance + SUM(t.income - t.expenses) AS balance
        FROM starting_balance sb
        LEFT JOIN transactions t ON (t.idBudget = sb.idBudget)
        GROUP BY
            sb.idBudget,
            sb.balance
    );
    

    换句话说,使用视图而不是表。您可以不时更新起始余额(删除或标记您不再需要的交易!),您可以使用物化视图。

    【讨论】:

    • 所以如果我使用视图,当事务表有任何更新时,表预算将得到更新?
    • 不,我的意思是您应该使用视图而不是表格。
    • 我刚刚发现我的视图表没有更新,我的意思是通过创建新预算,它们没有被添加到视图表中。
    • @Disputed 应该。如果您向该表添加新的起始余额,它应该显示在视图中。
    【解决方案2】:

    这样的?

    INSERT INTO Budget(SELECT idBudget, SUM(income)-SUM(expenses) as Balance
    FROM Transactions GROUP BY idBudget )
    
    delimiter //
    CREATE TRIGGER balance AFTER INSERT  ON Transactions
    FOR EACH ROW
    BEGIN
    INSERT INTO Budget(SELECT NEW.idBudget, SUM(NEW.income)-SUM(NEW.expenses) as Balance
        FROM Transactions GROUP BY idBudget )
    END;
    delimiter ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      相关资源
      最近更新 更多