2013-05-27 29 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