如何在MySQL中基于单列值执行两种计算生成total计算列
现有SQL存在的问题
- 语法结构错误:
CASE表达式的位置完全错误,将其他需要查询的普通业务字段全部嵌套进了CASE语法结构中,不符合SELECT子句的字段罗列规则。 - CASE语法不符合规范:每个
WHEN分支后不允许单独加字段别名,total别名需要放在整个CASE ... END结构的末尾;另外双分支判断可以用ELSE替代第二个WHEN简化逻辑,不需要额外写不等于判断。 - 分组规则不符合MySQL高版本要求:MySQL 5.7及以上版本默认开启
ONLY_FULL_GROUP_BY模式,SELECT中出现的非聚合字段必须全部包含在GROUP BY子句中,原SQL仅分组两个字段,但查询了大量未分组、未聚合的字段,执行会直接报错。 - 代码中存在HTML转义字符:原代码中的
<>是HTML转义后的不等于符号,实际SQL中需要写为<>或者!=。
正确实现的SQL语句
SELECT d2c_3_csg_batch_in.transactioncode AS transactioncode, d2c_3_csg_batch_in.site AS site, d2c_3_csg_employees.lastname AS lastname, d2c_3_csg_employees.firstname AS firstname, d2c_3_csg_employees.payrate AS payrate, d2c_3_csg_batch_in.employeecode AS employeecode, d2c_3_csg_batch_in.jobcode AS jobcode, d2c_3_csg_employees.CompanyFrequency AS CompanyFrequency, d2c_3_csg_batch_in.inputunits AS inputunits, d2c_3_csg_transactioncodes.multiplier AS multiplier, d2c_3_csg_transactioncodes.payspacewording AS payspacewording, -- 新增计算列total的逻辑 CASE WHEN d2c_3_csg_batch_in.transactioncode = '584' THEN d2c_3_csg_batch_in.inputunits ELSE d2c_3_csg_batch_in.inputunits * d2c_3_csg_employees.payrate * d2c_3_csg_transactioncodes.multiplier END AS total FROM d2c_3_csg_transactioncodes JOIN d2c_3_csg_batch_in ON d2c_3_csg_transactioncodes.code = d2c_3_csg_batch_in.transactioncode LEFT JOIN d2c_3_csg_employees ON d2c_3_csg_batch_in.employeecode = d2c_3_csg_employees.employeenumber WHERE d2c_3_csg_batch_in.flag = 'ADD' AND d2c_3_csg_batch_in.prp = 'Y' -- 适配ONLY_FULL_GROUP_BY模式,将所有非聚合查询字段加入分组 GROUP BY transactioncode, site, lastname, firstname, payrate, employeecode, jobcode, CompanyFrequency, inputunits, multiplier, payspacewording ORDER BY d2c_3_csg_batch_in.employeecode DESC, d2c_3_csg_batch_in.transactioncode;
如果你的业务逻辑仅需要按
employeecode和transactioncode去重,不需要保留其他字段的不同值,也可以把GROUP BY改为DISTINCT,或者对其他非分组字段用MAX()/MIN()等聚合函数包裹。
内容的提问来源于stack exchange,提问作者GURU mcewan.marriott
相关产品推荐
相关产品推荐

