按 id 将两列总和到一个字段

Posted

技术标签:

【中文标题】按 id 将两列总和到一个字段【英文标题】:Sum of two columns by id to one field 【发布时间】: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       |
|----+--------+---------------+-----|

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

【问题讨论】:

【参考方案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 ;

【讨论】:

以上是关于按 id 将两列总和到一个字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent NHibernate 有条件地将两列映射到一个字段

TypeError:不能将序列乘以“str”类型的非整数 - 将两列相乘后

如何将所有行的两列总和为第三列

怎么将两列数据合并

如何像蜂巢中的地图一样将两列合并为一列?

SQL:包含 NULLS 的两列的总和?