【问题标题】:Alternatives to the case statement in mysql 8 [closed]mysql 8中case语句的替代方案[关闭]
【发布时间】:2021-02-14 21:15:38
【问题描述】:

我有以下两张表,

津贴表,

employeeId    title    value       Salary   
  14          Mobile    200         13000    
  14          Transport 7000        13000   

代码表,

title               code
Transport            A1 
Mobile               A2 
Salary               A3

我想得到这样的结果,

employeeId    title       value    code     
      14       Mobile      200       A2          
      14       Transport   7000      A1     
      14        Salary     13000     A3 

我的查询如下,

select employeeId,title,CASE 
     WHEN title = 'Mobile'    THEN 'A1'
     WHEN title = 'Transport' THEN 'A2'
     ELSE 'A3' 
     END as AllowancesCode,
    value
     from Reports where employeeId = 14 ;

可以预见的是,这错过了 Salary 字段,

 employeeId title   AllowancesCode  value
   14       Mobile      A1           200
   14      Transport    A2          7000

编辑

数据更加清晰,

一个员工可以有不同价值的不同津贴,但工资是固定的,只有一个价值。具有另一个employeeid 的另一个员工可能有相同的薪水。一个employeeId 将具有一个salary 值。

【问题讨论】:

  • 想象第一个表中的 Salary 列值是 12000 和 14000 - 这种情况下的输出是什么?
  • @Akina 员工的薪水列值将相同。 employeeid 字段是这里的关键。
  • 员工的薪水列值将是相同的 证明它 - 提供提供这种平等的约束。如果不存在,则值可能不同。
  • @Akina 不确定您希望我如何证明这一点,但我知道我的数据。这样想,一个员工可以有不同的津贴,不同的价值,但工资是固定的,只会是一个价值。但是,具有另一个雇员 ID 的另一名雇员可能有相同的薪水。希望这是有道理的。
  • “可以预见的是,这错过了薪水领域,” - 这到底是什么意思?您分享的预期结果不包含任何“工资字段”

标签: mysql mysql-8.0


【解决方案1】:

我不会争论表结构,这可能是次优的。

我认为你最好为“Mobile”和“Transport”做一个连接,然后再用 union 查询薪水。

工资值是在每一行复制的,是否相同? 像这样的东西应该可以工作

    SELECT A.employeeId, A.title, A.value, B.code 
        FROM Allowance A INNER JOIN Codes B ON (A.title=B.title)
        WHERE A.employeeId = 14 
    UNION
    SELECT A.employeeId," Salary" as title, max(A.basicSalary) as value, B.code
        FROM Allowance A INNER JOIN Codes B ON (B.title="basicSalary")
        WHERE A.employeeId = 14 
        GROUP BY 1,2,4

如果您不想使用 2 where 并且数据不是太多,您可以创建一个视图或干脆这样做:

    SELECT * FROM (
        SELECT A.employeeId, A.title, A.value, B.code 
           FROM Allowance A INNER JOIN Codes B ON (A.title=B.title)
        UNION
        SELECT A.employeeId," Salary" as title, max(A.basicSalary) as value, B.code
           FROM Allowance A INNER JOIN Codes B ON (B.title="basicSalary")
           GROUP BY 1,2,4
    ) X
    WHERE X.employeeId=14

【讨论】:

  • 雇员 ID 的薪水是唯一的
  • 谢谢,我调整了第一个查询,看起来它正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多