如何编写SQL按TYPE规则计算成本:A类加、B类减并实现筛选分组
正确的SQL实现方案
嘿,我来帮你搞定这个成本计算的需求!首先得指出你原来SQL里的一个小坑:AND TR.TYPE = 'A' OR TR.TYPE = 'B' 这个条件的优先级有问题——SQL里AND的优先级比OR高,原语句会被解析成(NO in (...) AND TR.TYPE='A') OR TR.TYPE='B',这会导致所有TYPE='B'的记录不管NO是否在USERS表里都会被统计,显然不符合需求。
接下来是核心的成本计算逻辑调整:我们需要根据TYPE决定COST是加还是减,用CASE WHEN就能完美实现这个逻辑,再对处理后的数值求和即可。
完整的SQL语句
SELECT NO, SUM(CASE WHEN TR.TYPE = 'A' THEN COST WHEN TR.TYPE = 'B' THEN -COST ELSE 0 -- 若存在其他TYPE,可在这里定义默认处理规则,比如不计入总成本 END) AS TOTAL_COST FROM TR WHERE NO IN (SELECT NO FROM USERS) AND (TR.TYPE = 'A' OR TR.TYPE = 'B') -- 用括号包裹OR条件,确保逻辑正确性 GROUP BY NO;
示例数据验证
用你提供的TR_TABLE数据测试:
- NO=1的计算:1000(A)-500(B)+200(A)=700
- NO=2的计算:100(A)=100
完全匹配你期望的结果。
另外,如果你觉得写法可以更简洁,也可以用这个等价写法:
SELECT NO, SUM(COST * CASE WHEN TR.TYPE = 'A' THEN 1 ELSE -1 END) AS TOTAL_COST FROM TR WHERE NO IN (SELECT NO FROM USERS) AND (TR.TYPE = 'A' OR TR.TYPE = 'B') GROUP BY NO;
两种写法效果一致,看你个人习惯哪种更易读。
内容的提问来源于stack exchange,提问作者puss
相关产品推荐
相关产品推荐

