跨表使用CASE WHEN更新XYZ01、XYZ02项目对应stipend金额上调40%的方法
方案说明
你可以根据是否需要修改原表数据选择对应实现,两种写法都符合要求使用CASE WHEN语法的规则:
1. 仅查询展示上调后的金额(不修改原表数据)
通过两表关联,用CASE WHEN判断项目编号后计算调整后的金额:
SELECT s.subjectid, s.stipdate, s.amount AS 原金额, CASE WHEN sub.projid IN ('XYZ01', 'XYZ02') THEN s.amount * 1.4 ELSE s.amount END AS 调整后金额, sub.lname, sub.fname, sub.projid FROM stipend s LEFT JOIN subject sub ON s.subjectid = sub.subjectid ORDER BY s.subjectid, s.stipdate;
2. 直接更新stipend表的原金额数据
如果需要永久修改原表的AMOUNT字段值,用如下UPDATE语句:
UPDATE stipend s SET s.amount = CASE WHEN EXISTS ( SELECT 1 FROM subject sub WHERE sub.subjectid = s.subjectid AND sub.projid IN ('XYZ01', 'XYZ02') ) THEN s.amount * 1.4 ELSE s.amount END;
如果你使用的数据库支持UPDATE JOIN语法(比如MySQL、PostgreSQL),也可以结合CASE WHEN写得更简洁:
UPDATE stipend s JOIN subject sub ON s.subjectid = sub.subjectid SET s.amount = CASE WHEN sub.projid IN ('XYZ01', 'XYZ02') THEN s.amount * 1.4 ELSE s.amount END;
逻辑补充
- 仅当关联的subject表中projid为XYZ01或XYZ02时,才将对应stipend记录的AMOUNT乘以1.4(即上调40%),其余记录金额保持不变
- 如果需要保留指定小数位数,可以在金额计算外层套
ROUND()函数处理
内容的提问来源于stack exchange,提问作者Eddie14
相关产品推荐
相关产品推荐

