【问题标题】:Trying to do two MySQL Calculation based on value of one column [closed]尝试根据一列的值进行两次 MySQL 计算 [关闭]
【发布时间】:2021-12-10 20:54:14
【问题描述】:

我有一个 select 语句,但想要评估一列,如果它包含 584 的值。我正在尝试通过将其他 3 列相乘来创建一个名为 total 的新计算列,如果不是 584,则根据不同的列进行计算

    select CASE `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`,
        WHEN `d2c_3_csg_batch_in`.`transactioncode` = '584' THEN `d2c_3_csg_batch_in`.`inputunits` AS `total`
        WHEN `d2c_3_csg_batch_in`.`transactioncode` <> '584' THEN `d2c_3_csg_batch_in`.`inputunits` * `d2c_3_csg_employees`.`payrate` * `d2c_3_csg_transactioncodes`.`multiplier` AS `total` 
     END
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' 
group by `d2c_3_csg_batch_in`.`employeecode`,`d2c_3_csg_batch_in`.`transactioncode` 
order by `d2c_3_csg_batch_in`.`employeecode` desc,`d2c_3_csg_batch_in`.`transactioncode`

【问题讨论】:

  • 别名必须分配给整列表达式,而不是WHEN/ELSE 分支。
  • 这是一个无效的 case 语句,请参阅dev.mysql.com/doc/refman/5.7/en/case.html case 应该立即出现在第一个 when 子句之前..
  • 尝试在第一个 WHEN 语句之前添加 CASE 语句,但在 'AS total WHEN d2c_3_csg_batch_in.transactioncode '584' THEN...' 行附近出现语法错误14
  • 你还需要实现@akina评论。

标签: mysql case calculated-columns


【解决方案1】:

尝试使用 Sum if 例如

SUM(if (q1.bill = 584,q1.bill - q1.payment,0))AS bal,
SUM(if (q1.bill != 584,q1.payment - q1.bill  ,0))AS advpay,

q1 是表别名。其他领域是虚构的

纠正点:用case的时候,你这样做;

CASE WHEN `d2c_3_csg_batch_in`.`transactioncode` = '584' 
         THEN `d2c_3_csg_batch_in`.`inputunits` 
     WHEN `d2c_3_csg_batch_in`.`transactioncode` <> '584' 
         THEN `d2c_3_csg_batch_in`.`inputunits` * `d2c_3_csg_employees`.`payrate` * `d2c_3_csg_transactioncodes`.`multiplier` 
END AS `total`    -- an alias must be there!
 

【讨论】:

  • 谢谢!!!两个选项都有效...我首先这样做了,它 100% 有效,但随后使用了您的第二个建议 sum(if(d2c_3_csg_batch_in.transactioncode` = 584,d2c_3_csg_batch_in.inputunits,0)) + sum(if(@987654327 @.transactioncode 584,d2c_3_csg_batch_in.inputunits * d2c_3_csg_employees.payrate * d2c_3_csg_transactioncodes.multiplier,0)) AS total `
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多