从两个表中选择特定列

时间:2012-06-02 10:17:07

标签: sql sql-server sql-server-2008

假设我有两个表tblEmployeetblEmpSalary。我需要编写一个SQL语句来获取所有员工的名单,他们的姓名和工资,他们在每个部门获得最高薪水。

样本表数据在这里:

enter image description here

4 个答案:

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

如果两名或更多员工的最高工资相等 - 这将返回指定部门的所有员工。