Sql 从平均工资低于

Sql 从平均工资低于,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我必须编写一个查询,返回平均工资低于12000的部门的所有员工。 我写下了这个问题 SELECT DEPARTMENT_ID, FIRST_NAME, LAST_NAME FROM EMPLOYEES GROUP BY DEPARTMENT_ID,FIRST_NAME,LAST_NAME HAVING AVG(SALARY) < 12000 ORDER BY LAST_NAME ASC; 但它似乎不起作用。而不是从这些部门招聘所有员工,只招聘工资低于12000的员工。 如何正确编写此查询

我必须编写一个查询,返回平均工资低于12000的部门的所有员工。 我写下了这个问题

SELECT DEPARTMENT_ID, FIRST_NAME, LAST_NAME
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID,FIRST_NAME,LAST_NAME
HAVING AVG(SALARY) < 12000
ORDER BY LAST_NAME ASC;
但它似乎不起作用。而不是从这些部门招聘所有员工,只招聘工资低于12000的员工。 如何正确编写此查询? 提前感谢。

您需要子查询:

SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME
FROM EMPLOYEES e
WHERE e.DEPARTMENT_ID IN (SELECT e1.DEPARTMENT_ID
                          FROM EMPLOYEES e1
                          GROUP BY e1.DEPARTMENT_ID
                          HAVING AVG(e1.SALARY) < 12000
                         )
ORDER BY e.LAST_NAME ASC;

你需要这个部门的平均工资。我将使用窗口功能:

SELECT DEPARTMENT_ID, FIRST_NAME, LAST_NAME
FROM (SELECT e.*, AVG(SALARY) OVER (PARTITION BY DEPARTMENT_ID) as avg_salary_dept 
      FROM EMPLOYEES e
     ) e
WHERE avg_salary_dept < 12000
ORDER BY LAST_NAME ASC;

可以使用相关子查询

SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME
FROM EMPLOYEES a
WHERE exists (SELECT 1 FROM EMPLOYEES b
                          where a.department_id=b.department_id
                          HAVING AVG(b.SALARY) < 12000
                         );
试试看

SELECT e.DEPARTMENT_ID, e.FIRST_NAME, e.LAST_NAME
       from employee e where e.DEPARTMENT_ID in 
                                   (select e.DEPARTMENT_ID from employee e 
                                                  group by e.DEPARTMENT_ID
                                                   having avg(salary)<3000)

您需要计算每个部门的平均值,与名称分开。哦,好的,我将阅读有关窗口函数的内容。你能告诉我e是什么意思吗?它是某种变量吗?e是一个表别名。如果您不熟悉表别名和列别名,我强烈建议您研究它们。请解释他做错了什么以及为什么这个解决方案有效。这将有助于他/她了解正在发生的事情,并可能防止将来犯同样的错误。