【问题标题】:Name of department, Name of Manager, Number of employees who have salaries above average of the department部门名称、经理姓名、工资高于部门平均水平的员工人数
【发布时间】:2022-01-22 14:53:57
【问题描述】:

我需要这个问题的帮助

提供一个选择语句,该语句显示: 部门名称、经理姓名、有薪员工人数 高于部门平均水平。

我们在 Scott 和 Tiger 中使用的基本表(emp,dept)我试试这个代码:

   select d.dname , count (e.deptno) no_emp

   from emp e, dept d
  where e.deptno=d.deptno 
    and 
       e.sal >( select avg(sal) sal 
        from emp 

        where m.deptno=e.deptno 

        Group by m.deptno) 

       Group by e.deptno,d.dname 

而且我还没有回答完经理的名字没有出现:

Dname No_emp
ACCOUNTING 1
RESEARCH 3
SALES 2

我也试试这个代码:

select    d.dname, count(e.deptno) no_emp, e.ename mgr_dept 
from      emp e, dept d
where     e.deptno = d.deptno 
and       e.ename in 
     (select      ename 
      from        emp 
      where       job=‘MANAGER’ ) 
And       e.sal > 
     (select      avg(sal) sal 
      from        emp 
      where       m.deptno = e.deptno 
      Group by    m.deptno) 
Group by  e.deptno, d.dname, e.ename 

结果不正确:

DNAME NO_EMP MGR_DEPT
RESEARCH 1 JONES
SALES 1 BLAKE

【问题讨论】:

  • >> manger 的名称没有出现:查看查询的第一行:select d.dname , count (e.deptno) no_emp 你所要求的只是 dname 和 deptno 的计数(你称之为 no_emp)。您需要将管理器名称列(我猜是 m.ename 之类的)添加到您的查询中。
  • 我尝试了,但它没有用,因为我尝试了这个条件 e.job='MANGER' 给我 dept 的经理,它给出的计数等于一个取决于以前的条件
  • select d.dname ,e.ename as mg_dept , count (e.deptno) no_emp from emp e, dept d where e.deptno=d.deptno and e.job='MANGER' and e .sal >( select avg(sal) sal from emp where m.deptno=e.deptno Group by m.deptno) Group by e.deptno,d.dname
  • 好的,所以将新查询和您得到的结果添加到您的问题中。接下来,当您自己运行内部查询时会发生什么('select avg(sal)' 和 'group by m.deptno' 之间的所有内容)
  • 内部查询的结果是正确的,它给出了每个部门的平均销售量

标签: sql join select


【解决方案1】:

这里有两种方法

1) 加入一个计算高于平均工资的员工的子查询。

SELECT
  dep.dname as department
, mgr.ename as manager
, depstat.above_average_salary
FROM DEPT dep
LEFT JOIN EMP mgr 
  ON mgr.deptno = dep.deptno
  AND mgr.job = 'MANAGER'
JOIN (
    SELECT deptno, COUNT(empno) as above_average_salary
    FROM EMP e1
    WHERE sal > (SELECT AVG(sal) 
                 FROM EMP e2 
                 WHERE e2.deptno = e1.deptno)
    GROUP BY deptno
) depstat ON depstat.deptno = dep.deptno
ORDER BY dep.dname
部门 |经理 | ABOVE_AVERAGE_SALARY :--------- | :-------- | ------------------: 会计 |克拉克 | 1 研究 |琼斯 | 3 销售 |布莱克 | 2

2) 使用条件聚合

SELECT
  dep.dname as department
, MAX(CASE WHEN emp.job = 'MANAGER'
      THEN emp.ename END) as manager
, COUNT(CASE WHEN emp.sal > depstat.avg_sal 
        THEN emp.empno END) as above_average_salary
FROM DEPT dep
LEFT JOIN EMP emp 
  ON emp.deptno = dep.deptno
JOIN (
    SELECT deptno, AVG(sal) as avg_sal
    FROM EMP
    GROUP BY deptno
) depstat ON depstat.deptno = dep.deptno
GROUP BY dep.deptno, dep.dname
ORDER BY dep.dname
部门 |经理 | ABOVE_AVERAGE_SALARY :--------- | :-------- | ------------------: 会计 |克拉克 | 1 研究 |琼斯 | 3 销售 |布莱克 | 2

dbfiddle here

上的演示

不过还是有区别的。
第一种方法将显示每个经理。
第二种方法假设每个部门只有一名经理。

【讨论】:

  • 非常感谢你??我非常感谢
  • @ala 顺便说一句,你有没有注意到 OPERATIONS 部门不在结果中?那是因为他们在 EMP 表中没有员工,而且它不是 depstat 子查询的 LEFT JOIN。
  • 是的,我知道它没有任何员工。谢谢
猜你喜欢
  • 2012-08-02
  • 2018-04-16
  • 2021-09-09
  • 2019-01-25
  • 2020-08-09
  • 2023-03-22
  • 2022-11-10
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多