当前位置: 首页 > 知识库问答 >
问题:

一个更好的查询,以查找员工名单谁有最高工资在他们的部门?

胡鸿远
2023-03-14

我有一个表:[tblEmp]

EmpId | EmpName | DeptId

和表[tblSalary]

EmpId | Salary

而且我需要找到他们部门里工资最高的员工名单。

我可以通过以下方式实现这一点:

SELECT *
FROM tblEmp
JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
WHERE LTRIM(STR(deptid)) + LTRIM(STR(salary)) IN (
    SELECT LTRIM(STR(deptid)) + LTRIM(STR(MAX(salary)))
    FROM tblSal
    JOIN tblEmp ON tblSal.EmpId = tblEmp.EmpId
    GROUP BY DeptId
)

有没有更好的方法实现榜单?

共有2个答案

冯星剑
2023-03-14

这通常是您使用分析函数的地方:

SELECT *
FROM ( SELECT tblSal.*, tblEmp.*,
              RANK() OVER (PARTITION BY tblEmp.deptid ORDER BY tblSal.salary DESC) as SalaryRank
       FROM tblEmp
       JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
      )
WHERE SalaryRank = 1
莫欣悦
2023-03-14

您可以尝试使用row_number。

返回结果集分区中一行的顺序编号,每个分区中的第一行从1开始。

类似于

;WITH Employees AS (
        SELECT  e.*,
                ROW_NUMBER() OVER(PARTITION BY e.DeptId ORDER BY s.salary DESC) RowID
        FROM    [tblEmp] e INNER JOIN
                [tblSalary] s ON    e.EmpId = s.EmpId
)
SELECT  *
FROM    Employees
WHERE   RowID = 1

但是,这将不会返回在同一部门拥有相同薪资的员工。

为此,您可能需要查看RANK(Transact-SQL)或DENSE_RANK(Transact-SQL)而不是row_number。

Rank:返回结果集分区中每一行的秩。行的秩是一加所讨论的行之前的秩数。

如果两个或两个以上的行为一个等级打成平局,则每条打成平局的行将得到相同的等级。

Dense_Rank:返回结果集分区中行的排名,排名中没有任何间隙。行的秩是一加所讨论的行之前的不同秩的数目。

 类似资料:
  • 有两张桌子: 问题是如何找到哪个经理支付给他的员工的平均工资(+奖金)最高?

  • 问题内容: 不太确定如何获得这个。我有一个职员表,我需要找到平均工资。我知道我可以使用use 。但是,诀窍是我需要找到拥有5名以上职员的部门的平均值。我不确定是否应使用分组依据或使用方式。谢谢! 问题答案:

  • 问题内容: 我有一个100名员工的员工表。我想编写一个查询来查找具有相同BIRTHDATE的成对雇员。 结果应返回该对中每个雇员的EMPNO,LASTNAME和BIRTHDATE(6列结果表)。 我以为是这样 你认为这是正确的吗? 问题答案: 我会做:

  • 嗨,我有两个班,员工和部门。我的主要功能是读取一个。txt文件,填写员工姓名、工资、部门和职位。我的员工班只是一个有成就感和有成就感的人。为了代表员工,我制作了一份ArrayList列表,我不确定如何找到每个部门的最低工资。为了找到最高工资,我在我的系课上这样做了。 但我不知道怎样才能拿到最低工资。我的想法是从每个部门获得一名员工的工资,并以此作为工作的起点 但是我意识到我不知道该怎么办。我能得到

  • Sql查询来查找活动员工。根据employee id列降序对输出进行排序,只获取前15条记录。显示员工id、员工姓名、城市、州、国家、薪资、在职日期、状态、部门名称、经理姓名。雇员姓名:用空格字符连接firstname和lastname并只从雇员姓名中提取前10个字母经理姓名:显示firstname和lastname(用空格分隔) null

  • 问题内容: 假设您得到以下名为Employee的简单数据库表,该表具有2个列,分别名为Employee ID和Salary: 我想写一个查询,从员工那里选择max(salary)作为max_salary,2nd_max_salary 然后它应该返回 我知道如何找到第二高的薪水 或找到第n个 但我无法弄清楚如何将这2个结果结合起来以获得所需的结果 问题答案: 您可以只运行2个查询作为内部查询以返回2