2

假设我有两张桌子tblEmployeetblEmpSalary. 我需要编写一条 SQL 语句来获取所有员工的列表,包括他们的姓名和薪水,他们在每个部门中获得最高薪水。

示例表数据在这里:

在此处输入图像描述

4

4 回答 4

3

在这种情况下,您可以使用排名函数:

WITH ranked AS (
  SELECT
    e.*,
    s.monSalary,
    rnk = RANK() OVER (PARTITION BY e.strDepartment ORDER BY s.monSalary DESC)
  FROM tblEmplopyee e
  INNER JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID
)
SELECT
  intEmploeeID,
  strEmpName,
  strDepartment,
  monSalary
FROM ranked
WHERE rnk = 1

RANK()如果你只需要那些薪水最高的人,这个功能就可以了。使用RANK(),如果每个部门的薪水相同,则查询可能会返回多个员工。

或者,您可以使用DENSE_RANK()代替RANK(),具有相同的效果,但DENSE_RANK()也可以让您获得最高薪水的员工。(您可以在这样的条件下指定:n WHERE

WHERE rnk <= n

)

但是,如果您每个部门只需要一名员工,即使其中有几个符合要求,请使用ROW_NUMBER()代替RANK(). 但是你可能需要ORDER BY在排名函数的子句中添加另一个标准,例如:

... ORDER BY s.monSalary DESC, e.strEmpName ASC)

实际上,ROW_NUMBER()只会使您的查询面向员工而不是面向薪水。使用ROW_NUMBER(),您可以使用与使用相同的条件让您的查询返回n最高薪员工DENSE_RANK()

WHERE rnk <= n

您可以在 MSDN 上阅读有关 SQL Server 中排名函数的更多信息:

于 2012-06-02T11:27:34.197 回答
2
SELECT e.strEmpName, s.monSalary
FROM tblEmployee e
JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID
WHERE e.strDepartment + '-' + CAST(s.monSalary AS varchar(20)) IN (
     SELECT e2.strDepartment + '-' + CAST(MAX(s2.monSalary) AS varchar(20))
     FROM tblEmployee e2
     JOIN tblEmpSalary s2 ON e2.intEmployeeID = s2.intEmployeeID
     GROUP BY e2.strDepartment)

免责声明:我现在无法测试这个查询,所以它可能有一些小细节错误。

于 2012-06-02T10:36:22.903 回答
1
SELECT   a.d, a.m, b.strEmpName 
FROM     (
          SELECT    strDepartment d, MAX(monSalary) m 
          FROM      (
                     SELECT    * 
                     FROM      tblEmployee e 
                     LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID
                    ) 
           GROUP BY strDepartment
          ) a 
LEFT JOIN (
           SELECT    * 
           FROM      tblEmployee e 
           LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID
          ) b ON a.d=b.strDepartment AND a.m=b.M
于 2012-06-02T10:35:01.727 回答
0
SELECT tblEmployee.strEmpName, max_salaries.strDepartment, max_salaries.salary
FROM (SELECT tblEmployee.strDepartment, MAX(monSalary) 
      FROM tblEmployee INNER JOIN tblEmpSalary 
           ON tblEmployee.intEmployeeID = tblEmpSalary.intEmployeeID
      GROUP BY tblEmployee.strDepartment) max_salaries
INNER JOIN tblEmployee ON tblEmployee.strDepartment = max_salaries.strDepartment
INNER JOIN tblEmpSalary ON tblEmpSalary.monSalary = max_salaries.salary
           AND tblEmpSalary.intEmployeeID = tblEmployee.intEmployeeID

如果有两个或更多员工的最高工资相等 - 这将返回指定部门的所有员工。

于 2012-06-02T11:17:16.927 回答