假设我有两张桌子tblEmployee
和tblEmpSalary
. 我需要编写一条 SQL 语句来获取所有员工的列表,包括他们的姓名和薪水,他们在每个部门中获得最高薪水。
示例表数据在这里:
假设我有两张桌子tblEmployee
和tblEmpSalary
. 我需要编写一条 SQL 语句来获取所有员工的列表,包括他们的姓名和薪水,他们在每个部门中获得最高薪水。
示例表数据在这里:
在这种情况下,您可以使用排名函数:
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 中排名函数的更多信息:
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)
免责声明:我现在无法测试这个查询,所以它可能有一些小细节错误。
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
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
如果有两个或更多员工的最高工资相等 - 这将返回指定部门的所有员工。