假设我有两个表tblEmployee
和tblEmpSalary
。我需要编写一个SQL语句来获取所有员工的名单,他们的姓名和工资,他们在每个部门获得最高薪水。
样本表数据在这里:
答案 0 :(得分: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
< / em> 薪水。 (您可以在WHERE
条件中指定,如下所示:
WHERE rnk <= n
)
但是,如果每个部门需要完全一名员工,即使其中有多名员工符合要求,也请使用ROW_NUMBER()
代替RANK()
。但是,您可能需要在排名函数的ORDER BY
子句中添加另一个标准,例如:像这样:
... ORDER BY s.monSalary DESC, e.strEmpName ASC)
事实上,ROW_NUMBER()
只会使您的查询以员工为导向而不是以薪水为导向。使用ROW_NUMBER()
,您可以使用与{{1}相同的条件,让您的查询返回 n
付费最高的员工 }}:
DENSE_RANK()
您可以在MSDN上阅读有关SQL Server中排名功能的更多信息:
答案 1 :(得分: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)
免责声明:我现在无法测试此查询,因此可能会出现一些细节错误。
答案 2 :(得分: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
答案 3 :(得分: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
如果两名或更多员工的最高工资相等 - 这将返回指定部门的所有员工。