如何解决具有CASE和JOIN子查询的Oracle SQL查询
我正在尝试在Oracle中编写SQL查询以按年级返回员工薪水。我正在使用子查询来确定每个年级的薪水范围。
下面的查询不起作用,它会返回“ ORA-00936:缺少表达式”错误。
我在做什么错了?
SELECT a.last_name,a.salary,b.grade_level,b.lowest_sal,b.highest_sal
FROM employees a
JOIN (
SELECT
CASE salary
WHEN BETWEEN 1000 AND 2999 THAN 'A'
WHEN BETWEEN 3000 AND 5999 THAN 'B'
ELSE 'C'
END AS grade_level,MIN(salary) AS lowest_sal,MAX(salary) AS highest_sal
FROM employees
GROUP BY grade_level) b
ON(a.salary BETWEEN b.lowest_sal AND b.highest_sal)
ORDER BY last_name;
解决方法
我认为窗口函数是一种更好的方法:
SELECT e.*,MIN(salary) OVER (PARTITION BY grade_level) as lowest_sal,MAX(salary) OVER (PARTITION BY grade_level) as highest_sal
FROM (SELECT (CASE WHEN salary BETWEEN 1000 AND 2999 THAN 'A'
WHEN salary BETWEEN 3000 AND 5999 THAN 'B'
ELSE 'C'
END) AS grade_level,e.*
FROM employees e
) e
ORDER BY last_name ;
请注意,这也可以修复CASE
表达式,该表达式在查询中在语法上也是错误的。
谢谢Gordon和HelenA
。您的评论帮助我发现了我的代码中的错误。
- 我的CASE表达式中的语法错误
GROUP BY中的 - 表别名。
SELECT a.last_name,a.salary,b.grade_level,b.lowest_sal,b.highest_sal
FROM employees a
JOIN (
SELECT CASE
WHEN salary BETWEEN 1000 AND 2999 THEN 'A'
WHEN salary BETWEEN 3000 AND 5999 THEN 'B'
ELSE 'C'
END AS grade_level,MIN(salary) AS lowest_sal,MAX(salary) AS highest_sal
FROM employees
GROUP BY salary) b
ON(a.salary BETWEEN b.lowest_sal AND b.highest_sal)
ORDER BY last_name ;
输出:
LAST_NAME SALARY GRADE_LEVEL LOWEST_SAL HIGHEST_SAL
Abel 11000 C 11000 11000
Davies 3100 B 3100 3100
De Haan 17000 C 17000 17000
Ernst 6000 C 6000 6000
Fay 6000 C 6000 6000
Gietz 8300 C 8300 8300
Grant 7000 C 7000 7000
Hartstein 13000 C 13000 13000
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。