2017-11-25 139 views
0

检查我有表如下更新,并在同一时间

CatID| Total_Amount | Amount_paying |IsCompleted 
-----|--------------|---------------|------------ 
CA01 | 2000  | 1700  | 0 

在这个表我要检查是否TOTAL_AMOUNT和amount_paying是相同或不? 其中total_amount是固定的,且amount_paying将在每个插入语句后最大化。

所以如果我插入一条记录

CatID| Total_Amount | Amount_paying |IsCompleted 
    -----|--------------|---------------|------------ 
    CA01 | 2000  | 1700  | 0 
    CA01 | 2000   | 300  | 1 

在这里,我付300,所以TOTAL_AMOUNT = Amount_Paying和IsCompleted = 1

UPDATE tbl 
     SET is_completed = CASE WHEN SUM(amount_paying) = Total_Amount THEN 1 ELSE 0 END 
     WHERE tbl.branch_id [email protected] AND [email protected] 

An aggregate may not appear in the set list of an UPDATE statement.

+0

您的意思是“如果总和(amount_paying)= 2000那么1 ELSE 0'? Yourr问题不清楚,如果插入另一行'SUM(amount_paying)'>> 2000 – Sami

+0

sum(amount_paying)> 200?会发生什么?真假 – Babai

回答

0

如果数据库引擎允许UPDATE声明中的相同目标表:

UPDATE tbl 
SET IsCompleted = IF((SELECT SUM(Amount_paying) FROM tbl WHERE CatID = 'CA01') >= Total_Amount, 1, 0) 
WHERE CatID = 'CA01'; 

但是,例如,使用MySQL,您将获得Query Error: Error: ER_UPDATE_TABLE_USED

所以,下面应该工作:

UPDATE tbl AS t 
JOIN (
    SELECT 
    CatID, 
    SUM(Amount_paying) AS totalAP 
    FROM tbl 
    WHERE CatID = 'CA01' 
    GROUP BY CatID 
) AS t2 ON (t2.CatID = t.CatID) 
SET t.IsCompleted = IF(t2.totalAP >= t.Total_Amount, 1, 0) 
WHERE t.CatID = 'CA01'; 

这里是一个demo fiddle

注意:在你自己的例子中,你试图设置is_completed。根据你的表格,它应该是IsCompleted