【问题标题】:Write a SQL query to find employees who earn the top three salaries for the IT department编写 SQL 查询,查找 IT 部门收入前三名的员工
【发布时间】:2021-02-18 00:51:12
【问题描述】:

编写 SQL 查询以查找在 IT 部门获得前三名薪水的员工。

我的查询:

SELECT TOP(3) WITH TIES 
    d.name AS department, e.name AS employee, e.salary 
FROM 
    employee e, department d
WHERE 
    e.departmentid = d.id AND d.name ='IT'
ORDER BY 
    e.salary DESC

这应该显示 4 个结果。因为我包括了关系。但由于某种原因,它不是。我不明白为什么。我需要前 3 名的薪水,包括领带。

我得到这个结果:

Department Employee Salary
IT Max 90000
IT Randy 85000
IT Joe 85000

预期结果:

Department Employee Salary
IT Max 90000
IT Randy 85000
IT Joe 85000
IT Will 70000

员工表

Id Name Salary DepartmentId
1 Joe 85000 1
2 Henry 80000 2
3 Sam 60000 2
4 Max 90000 1
5 Janet 69000 1
6 Randy 85000 1
7 Will 70000 1

部门表:

Id Name
1 IT
2 Sales

【问题讨论】:

  • salary 的数据类型是什么?你为什么要使用旧式, 连接?
  • 85000 是您所看到的,但可能不完全是这样,所以我的第一个猜测是它不是一个确切的平局。
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(近 30 年前),不鼓励使用它

标签: sql sql-server


【解决方案1】:

为此,您将需要窗口函数。 SELECT TOP (n) WITH TIES 停在n 行,如果有平局,则只包含更多行。

因此,除了正确、明确、标准、可读的JOIN 语法外,您还可以了解窗口函数:

SELECT e.*
FROM (SELECT d.name as department, e.name as employee, e.salary,
             DENSE_RANK() OVER (ORDER BY e.salary DESC) as seqnum
      FROM employee e JOIN
           department d
           ON e.departmentid = d.id and d.name = 'IT'
     ) e
WHERE seqnum <= 3
ORDER BY e.salary DESC

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 2023-01-16
    • 2021-03-15
    • 2010-11-06
    • 1970-01-01
    • 2017-09-08
    • 2014-02-05
    • 2021-08-22
    相关资源
    最近更新 更多