Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我怎样才能让我的薪资级别转换案例成为有效的列名_Sql_Sql Server_Database_Sorting_Error Handling - Fatal编程技术网

Sql 我怎样才能让我的薪资级别转换案例成为有效的列名

Sql 我怎样才能让我的薪资级别转换案例成为有效的列名,sql,sql-server,database,sorting,error-handling,Sql,Sql Server,Database,Sorting,Error Handling,系统在案例方法“salary\u score=case salary\u level…”中显示无效的列名“salary\u level”。您不能指向查询中生成的列。您可以重复使用相同的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.

系统在案例方法“salary\u score=case salary\u level…”中显示无效的列名“salary\u level”。

您不能指向查询中生成的列。您可以重复使用相同的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 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

因为别名在同一
select
语句中不可用。您需要一个
子选择
应用
操作符来使用别名

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

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

请不要张贴图片。需要文本。不能在同一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