回答
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