【问题标题】:how can i let my salary_level switch case become a valid column name我怎样才能让我的salary_level 切换案例成为有效的列名
【发布时间】:2020-03-18 02:17:58
【问题描述】:
select concat(first_name,' ',last_name) as name,J.job_title, salary, J.min_salary, J.max_salary,(case 
when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.9) then 'SS' 
when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.7) then 'S' 
when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.5) then 'A' 
when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.3) then 'B' 
when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.1) then 'C'
else 'D' end) as salary_level, salary_score = case salary_level
when 'SS' then 1
when 'S' then 2
when 'A' then 3
when 'B' then 4
when 'C' then 5
when 'D' then 6 end from employees E inner join jobs J  on E.job_id = J.job_id order by  salary_score

系统在案例方法“salary_score = case sale_level ...”中显示无效的列名“salary_level”

【问题讨论】:

  • 请不要发布图片。需要文字。
  • 您不能在同一个 select 子句中引用计算列。重复计算列的代码或使其成为子查询。

标签: sql sql-server database sorting error-handling


【解决方案1】:

您不能将引用指向查询中生成的列。您可以重复使用相同的 CASE 语句来生成 1 到 6,如下所示-

select concat(first_name,' ',last_name) as name,J.job_title, salary, J.min_salary, J.max_salary,
(case 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.9) then 'SS' 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.7) then 'S' 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.5) then 'A' 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.3) then 'B' 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.1) then 'C'
    else 'D' 
end) as salary_level, 
salary_score = (case 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.9) then 1 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.7) then 2 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.5) then 3 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.3) then 4 
    when salary >= (J.min_salary + (J.max_salary - J.min_salary)*0.1) then 5
    else 6 
end) 
from employees E inner join jobs J  on E.job_id = J.job_id order by  salary_score

【讨论】:

    【解决方案2】:

    因为别名在同一个select 语句中不可用。您需要 sub-selectapply 运算符才能使用别名。

    在这种情况下,我更喜欢Apply 运算符,这样可以避免sub-select 并且看起来很干净

    SELECT Concat(first_name, ' ', last_name) AS NAME, 
           j.job_title, 
           salary, 
           j.min_salary, 
           j.max_salary, 
           cs.salary_level, 
           salary_score = CASE salary_level 
                            WHEN 'SS' THEN 1 
                            WHEN 'S' THEN 2 
                            WHEN 'A' THEN 3 
                            WHEN 'B' THEN 4 
                            WHEN 'C' THEN 5 
                            WHEN 'D' THEN 6 
                          END 
    FROM   employees E 
           INNER JOIN jobs J 
                   ON e.job_id = j.job_id 
           CROSS apply (SELECT CASE WHEN salary >= ( j.min_salary + ( j.max_salary - j.min_salary ) * 0.9 ) THEN 'SS' 
                                 WHEN salary >= ( j.min_salary + ( j.max_salary - j.min_salary ) * 0.7 ) THEN 'S' 
                                 WHEN salary >= ( j.min_salary + ( j.max_salary - j.min_salary ) * 0.5 ) THEN 'A' 
                                 WHEN salary >= ( j.min_salary + ( j.max_salary - j.min_salary ) * 0.3 ) THEN 'B' 
                                 WHEN salary >= ( j.min_salary + ( j.max_salary - j.min_salary ) * 0.1 ) THEN 'C' 
                                 ELSE 'D' 
                               END) cs (salary_level) 
    ORDER  BY salary_score 
    

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2022-11-29
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2022-10-14
      • 2012-10-04
      相关资源
      最近更新 更多