2012-06-02 136 views
2

假設我有兩個表tblEmployeetblEmpSalary。我需要編寫一個SQL語句,以獲得所有員工名單和薪水名單,他們在每個部門中獲得最高薪水。從兩個表中選擇特定列

樣品表中的數據是在這裏:

enter image description here

回答

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) 

聲明:我現在不能測試此查詢,所以它可能有一些小細節錯誤。

+0

嗨@Pablo它的聲音很好,但通過像'轉換失敗時轉換varchar值'C++''到數據類型int'.錯誤沒有部門ID,這裏只有部門名稱。 – yeasir007

+0

@ yeasir007好吧,我改變了一下查詢,我thik應該修復它。 – Pablo

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 
+0

理解的,nawfal:> –

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 

如果兩名或兩名以上員工的最高工資相等 - 這將返回所有指定部門的員工。

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排序功能:

+0

+1我更喜歡這個解決方案,因爲它更容易爲排名標準或分組添加更多字段(在這個例子中,他們可能有子部門。 – JeffO