2012-06-02 100 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