2013-05-27 27 views
1

我需要选择薪水大于部门分组平均薪资的员工。Oracle - 如何从子查询返回平均值?

SELECT * FROM employees 
WHERE salary > (SELECT AVG(salary), department_id FROM employees GROUP BY department_id) 

这是失败的,因为它返回我2列。

我曾尝试与此查询:

SELECT * FROM employees 
HAVING salary > AVG(salary) 
GROUP BY (department_id) 

现在我收到错误消息:ORA-00979:不是GROUP BY表达式

回答

3

最简单的跨数据库的方法是使用a JOIN:

SELECT employees.* 
FROM employees 
JOIN (SELECT department_id, AVG(salary) avgSalary 
     FROM employees 
     GROUP BY department_id) departmentSalaries 
    ON employees.department_id = departmentSalaries.department_id 
    AND employees.salary > departmentSalaries.avgSalary 

Oracle最有效的方法是使用解析函数(又名窗口函数):

SELECT * FROM (
    SELECT e.*, AVG(e.salary) OVER (PARTITION BY e.department_id) as avgSalary 
    FROM employees e) t 
WHERE salary > avgSalary