我需要一些oracle sql的帮助.问题:我有2个员工和部门表.我从一个查询得到了平均部门薪水,我想用它来看看有多少员工赚的钱多于他们部门的平均水平.到目前为止我有这个.
此查询返回部门的平均值:
select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee, department
where department.department_id = employee.department_id
group by department_name
Run Code Online (Sandbox Code Playgroud)
我想做的是:
select employee_name,
salary,
d.department_name
from employee e,
department d
where salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee,
department
where department.department_id = employee.department_id
group by department_name)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:01427.00000 - "单行子查询返回多行"
我知道同一部门的2名员工赚的钱多于平均水平,我认为这是造成这个问题的原因.
EMPLOYEE_NAME - SALARY - -DEPARTMENT_NAME- DEPT_AVG_SAL
-------------------- ---------------------- -------------------- ------------
FISHER - 3000.00 - SALES - 2500.00
JONES - 3000.00 - ACCOUNTING - 2750.00
KING - 5000.00 - EXECUTIVE - 4500.00
**SCOTT - 2500.00 - IT - 2100.00
SMITH - 2900.00 - IT - 2100.00**
WILSON - 3000.00 - RESEARCH - 2633.33
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
您的初始查询缺少外部查询的任何连接条件以及内部查询中的任何相关条件,这些条件将仅限于感兴趣的部门的行.通常你也不希望group by name大概id是主键.
解决这些问题以修复相关子查询
SELECT e.employee_name,
e.salary,
d.department_name
FROM employee e
JOIN department d
ON d.department_id = e.department_id
WHERE e.salary > (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal
FROM employee e2
WHERE e2.department_id = e.department_id)
Run Code Online (Sandbox Code Playgroud)
但是你可能会发现抛弃标量相关的子查询并用派生表替换效果更好.
SELECT e.employee_name,
e.salary,
d.department_name
FROM employee e
JOIN department d
ON d.department_id = e.department_id
JOIN (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal,
department_id
FROM employee
GROUP BY department_id) e2
ON e2.department_id = e.department_id
AND e.salary > e2.Dept_avg_sal
Run Code Online (Sandbox Code Playgroud)
对于Oracle,我认为以下也应该有效
SELECT employee_name,
salary,
d.department_name
FROM (SELECT employee_name,
salary,
d.department_name,
AVG(Salary) OVER (PARTITION BY e.department_id) AS AvgSalary
FROM employee e
JOIN department d
ON d.department_id = e.department_id)
WHERE salary > AvgSalary
Run Code Online (Sandbox Code Playgroud)