回答
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
理解的,nawfal:> –
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
如果两名或两名以上员工的最高工资相等 - 这将返回所有指定部门的员工。
你可以在这种情况下使用的排名功能:如果你只需要那些谁拥有最顶端的工资
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排序功能:
+1我更喜欢这个解决方案,因为它更容易为排名标准或分组添加更多字段(在这个例子中,他们可能有子部门。 – JeffO
- 1. 从列表中选择特定项目
- 2. 从表中选择特定的列名
- 3. 选择从的GroupBy列表中选择特定的列
- 4. 从两个表中选择列Yii2
- 5. 从两个表中选择
- 6. 从两个表中选择?
- 7. 从两个表中选择?
- 8. MYSQL从两个表中选择具有特定条件的值
- 9. 从IList选择特定列表
- 10. 如何从sqlite中的多个表中选择特定的列?
- 11. 从两个表中选择一个表
- 12. 从两个表中选择joid vs加入两个选择
- 13. 从两个表中选择*成伪码两个单独列出
- 14. 两个选择与表列
- 15. 从两个表中选择并从两个'朋友列表'中检查
- 16. 从CSV文件中选择特定列
- 17. Mysql-从特定条件下的两列中选择
- 18. 在单个查询中选择两个特定的mysql表行
- 19. 从两张同列的表中选择
- 20. 从mySQL中的两个连接表中选择一个特定的行
- 21. 从两个表中选择一个XML
- 22. 从一个两个表中选择值
- 23. 从两个表中选择一个
- 24. Django - 从2D列表中选择特定的行和列
- 25. 从表中选择特定行
- 26. 从表中选择特定数据(td)
- 27. 从表中选择特定的字段?
- 28. 仅从特定表中选择maxdate行
- 29. 从两列中选择?
- 30. 从两个阵列中选择一对
嗨@Pablo它的声音很好,但通过像'转换失败时转换varchar值'C++''到数据类型int'.错误没有部门ID,这里只有部门名称。 – yeasir007
@ yeasir007好吧,我改变了一下查询,我thik应该修复它。 – Pablo