按 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 有条件地将两列映射到一个字段