【问题标题】:How to find dept name that has the highest average salary within two tables如何在两个表中找到平均工资最高的部门名称
【发布时间】:2019-02-20 02:46:01
【问题描述】:

有两张桌子

Employee
Id
Name
Salary
DepartmentId

Departament
Id
Name

如何才能得到两张表中最高的平均工资 喜欢

Joe and Max belong to dept 1 so, avg is (70K+90K)/2
= 80K

Henry and Sam belog to dept 2, avg is (80K + 60K)/2=70k

那么如何通过部门选择最高的平均工资?,在这种情况下

IT 80K

我一直在尝试:

'按部门对工资进行分组,用Max函数取最高的。

select 
    Department.Name as Department,
    T.M as Salary
from
    Employee,
    Department,
    (select DepartmentId as ID, Max(Salary) as M from Employee group by DepartmentId) as T
where
    Employee.Salary = T.M and
    Department.Id = T.ID and 
    Employee.DepartmentId = Department.Id

enter image description here

【问题讨论】:

  • 您也可以尝试使用 Avg 来代替 Max 吗?您使用的是哪个 RDBMS?
  • 我使用的是sql server
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它

标签: sql sql-server


【解决方案1】:

如果多个部门的最高平均工资相同,则此解决方案将返回多行。

SELECT *
FROM(
SELECT d.Id, d.Name, AVG(e.Salary) avg_salary, RANK() OVER(ORDER BY AVG(e.Salary) DESC) AS rank_
FROM Employee e
INNER JOIN Departament d ON e.DepartmentId = d.Id
GROUP BY d.Id, d.Name
)T
WHERE rank_ = 1

【讨论】:

    【解决方案2】:

    如果您想获得部门的平均值,您可以使用这种方式。

    select DepartmentId as ID,  de.name as Deptname,  Avg(Salary) as M from Employee em1 
           join Department de on de.departmentID = em1.DepartmentId 
              group by DepartmentId, de.name
    

    如果您想要员工姓名和最高平均值,那么您也可以使用这种方法。

    select 
    Deptname as Department,
    e.Name as Employeename, 
    z.M as Salary
    from
    Employee e 
    join 
    ( select DepartmentId,Deptname, M, row_number() (order by m desc) rownum from (   select DepartmentId as ID,  de.name as Deptname,  Avg(Salary) as M from Employee em1 
           join Department de on de.departmentID = em1.DepartmentId 
              group by DepartmentId, de.name) as T) z
    on 
    e.DepartmentId = T.DepartmentId  and z.rownum = 1 
    

    【讨论】:

      【解决方案3】:

      如果您想要一个完整的答案,您应该提供 DDL、示例数据和所需的结果。 如果我理解正确,您正在寻找类似的东西:

      SELECT DepartmentID, AVG(Salary) AS AverageSalaryForDept
      FROM Employee
      GROUP BY DepartmentID
      ORDER BY AverageSalaryForDept DESC;
      

      这将为您提供所有平均值,从最高到最低排序。现在如果你只想要最上面的,添加一个 FETCH 子句:

      SELECT DepartmentID, AVG(Salary) AS AverageSalaryForDept
      FROM Employee
      GROUP BY DepartmentID
      ORDER BY AverageSalaryForDept DESC
      OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
      

      HTH

      【讨论】:

      • 我认为您缺少仅考虑第一个表来获取部门名称的部分?问题要求显示部门名称,我们也需要链接第二个表。
      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 2022-01-22
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 2012-08-02
      • 2018-04-16
      • 2020-08-09
      相关资源
      最近更新 更多