我有一个像这样的表:例如,trans是表的名称
Id | Trans_Date | Account_Id | Amount | Delta ------------------------------------------------------ 1 | 2011-02-20 00:00:00 | 2 | 1200 | NULL ------------------------------------------------------ 2 | 2011-03-21 00:00:00 | 2 | 2000 | NULL ------------------------------------------------------ 3 | 2011-04-22 00:00:00 | 2 | 4500 | NULL ------------------------------------------------------ 4 | 2011-02-20 00:00:00 | 4 | 1000 | NULL ------------------------------------------------------ 5 | 2011-03-21 00:00:00 | 4 | 2400 | NULL ------------------------------------------------------ 6 | 2011-04-22 00:00:00 | 4 | 3000 | NULL ------------------------------------------------------
而且我必须更新Delta列。假设每月有一笔交易,则该值是同一帐户的当前行与同一帐户的先前行之差。这是一个可以生成增量值的虚拟sql
select tt1.id, tt1.amount , tt1.AccountId,(tt1.amount-tt2.amount) as delta from trans tt1 left outer JOIN trans tt2 on tt1.accountid = tt2.accountid where month(tt1.date1)-month(tt2.date1)=1 ;
该查询的结果是
id | amount | AccountId | delta | ------------------------------------- 2 | 2000 | 2 | 800 | ------------------------------------- 3 | 4500 | 2 | 2500 | ------------------------------------- 5 | 2400 | 4 | 1400 | ------------------------------------- 6 | 3000 | 4 | 600 | -------------------------------------
但是没有任何前一行的行的增量应该是其数量,例如
1 | 1200 | 2 | 1200 | ----------------------------------------- 4 | 1000 | 4 | 1000 | -----------------------------------------
这些都是顺便说了。
请帮助我解决此查询。
这是您对原始查询进行的相应修改:
select tt1.id, tt1.amount, tt1.AccountId, (tt1.amount-ifnull(tt2.amount, 0)) as delta from trans tt1 left outer JOIN trans tt2 on tt1.accountid = tt2.accountid and month(tt1.date1)-month(tt2.date1)=1;
月比较从移动where到on,这使得一个差left join,并且tt2.amount被替换为ifnull(tt2.amount, 0)。
where
on
left join
tt2.amount
ifnull(tt2.amount, 0)
UPDATE 脚本 的版本:
UPDATE
update tt1 set delta = (tt1.amount-ifnull(tt2.amount, 0)) from trans tt1 left outer JOIN trans tt2 on tt1.accountid = tt2.accountid and month(tt1.date1)-month(tt2.date1)=1;
上述更新的正确MySQL语法实际上应为:
update trans tt1 left outer JOIN trans tt2 on tt1.accountid = tt2.accountid and month(tt1.date1)-month(tt2.date1)=1 set tt1.delta = (tt1.amount-ifnull(tt2.amount, 0));
(感谢 @pinkb 。)