如何根据查询中的部门获取员工的名字和最高工资?

时间:2017-03-06 05:03:12

标签: sql sql-server group-by

如何从firstname表中获取employeedetail

我正在执行以下命令并根据他们的部门获得员工的max薪水:

select department, max(salary) 
from employeedetail 
where salary in (
    select max(salary) 
    from employeedetail 
    group by department
) 
group by department

但是当我尝试使用上述查询返回firstname时,它会显示以下错误消息:

  

Msg 8120,Level 16,State 1,Line 1947 Column   'employeedetail.firstname'在选择列表中无效,因为它是   不包含在聚合函数或GROUP BY子句中。

我如何获得firstname

2 个答案:

答案 0 :(得分:3)

您正在收到此即时错误,因为您尝试选择未在GROUP BY子句中出现的非聚合列。接近这一点的一种规范方法是使用子查询来查找每个部门的最高工资。然后,将您的employeedetails表加入此子查询,以获取每个部门中薪水最高的员工的姓名。

SELECT t1.firstname, t1.department
FROM employeedetail t1
INNER JOIN
(
    SELECT department, MAX(salary) AS max_salary
    FROM employeedetail
    GROUP BY department
) t2
    ON t1.department = t2.department AND
       t1.salary     = t2.max_salary

解决此问题的另一种方法是使用ROW_NUMBER()。如果您想要解决同一部门中两个或更多员工之间关于最高薪水的关系,这可能会更有用。这样的事情会是另一种选择:

SELECT t.firstname, t.salary
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) rn
    FROM employeedetail
) t
WHERE t.rn = 1

这里ROW_NUMBER()的用处是我们可以通过在分区的ORDER BY子句中添加其他条件来处理薪水关系。例如,我们可以使用员工年龄/任期来解决问题,优先考虑高级员工:

ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary, tenure DESC)

答案 1 :(得分:1)

以下是TSQL代码的另一种变体,以实现相同的结果。

SELECT  E.FirstName, S.*
FROM (  select  department, max(salary) as max_Salary
        from    employeedetail
        group by department
     ) S
CROSS APPLY
    (SELECT e.* FROM employeedetail AS e WHERE e.department = S.department AND e.Salary = S.max_Salary) AS E;

因此,通过比较IO&您环境中所有查询的时间统计信息。 http://statisticsparser.com/网站可以帮助分析查询统计信息。