如何选择部门的前三名薪水?

Are*_*efe 5 mysql sql

我正在尝试在线解决有2个表的SQL问题,如下所示,

员工

Employee表包含所有员工.

+----+-------+--------+--------------+
| Id | Name  | Sa1ary | DepartmentId |
+----+-------+--------+--------------+
|  1 | Joe   |  70000 |            1 |
|  2 | Henry |  80000 |            2 |
|  3 | Sam   |  60000 |            2 |
|  4 | Max   |  90000 |            1 |
|  5 | Janet |  69000 |            1 |
|  6 | Randy |  85000 |            1 |
+----+-------+--------+--------------+
Run Code Online (Sandbox Code Playgroud)

部门

在此输入图像描述

SQL应该返回以下数据

在此输入图像描述

我有以下SQL查询,

    SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary 
FROM Employee E INNER JOIN Department D ON E.DepartmentId = D.Id 
WHERE (SELECT COUNT(DISTINCT(Salary)) FROM Employee 
       WHERE DepartmentId = E.DepartmentId AND Salary > E.Salary) < 3
ORDER by E.DepartmentId, E.Salary DESC;
Run Code Online (Sandbox Code Playgroud)

SQL很好,但是,我对这< 3部分感到困惑.它不应该是= 3,因为在被问及前3名工资的问题?我很感激SQL的解释,并会有所帮助.

Con*_*rix 8

如果您添加了一列, Count employees who earn more您的表格将如下所示

+----+-------+--------+--------------+-------------------------------+
| Id | Name  | Sa1ary | DepartmentId | Count employees who earn more |
+----+-------+--------+--------------+-------------------------------+
|  1 | Joe   |  70000 |            1 |    2                          |
|  2 | Henry |  80000 |            2 |    0                          |
|  3 | Sam   |  60000 |            2 |    1                          | 
|  4 | Max   |  90000 |            1 |    0                          |
|  5 | Janet |  69000 |            1 |    3                          |
|  6 | Randy |  85000 |            1 |    1                          |
+----+-------+--------+--------------+-------------------------------+
Run Code Online (Sandbox Code Playgroud)

然后找到每个部门的前3名.你的WHERE会

WHERE `Count employees who earn more` < 3
Run Code Online (Sandbox Code Playgroud)

如果你拥有=3它将返回唯一的第四高的员工

由于您没有该列,因此这就是SQL的作用

(SELECT COUNT(DISTINCT(Salary)) FROM Employee 
       WHERE DepartmentId = E.DepartmentId AND Salary > E.Salary)
Run Code Online (Sandbox Code Playgroud)

如果您想生成上述表格,可以执行以下操作

SELECT 
      D.Name AS Department, 
      E.Name AS Employee, 
      E.Salary AS Salary,
      Count(E2.Salary) as Count_employees_who_earn_more
FROM Employee E 
INNER JOIN Department D 
ON E.DepartmentId = D.Id 
LEFT JOIN Employee E2 ON 
    e2.DepartmentId = E.DepartmentId
    AND E2.Salary > E.Salary
GROUP BY  D.Name , 
      E.Name , 
      E.Salary 
Run Code Online (Sandbox Code Playgroud)

演示


小智 8

我正在处理相同的 SQL 问题。

以防万一有人需要帮助。

这是我想出的答案。

SELECT
    dpt.Name AS Department,
    e1.Name AS Employee,
    e1.Salary AS Salary
FROM Employee AS e1
INNER JOIN Department dpt
ON e1.DepartmentID = dpt.Id
WHERE 3 > (
           SELECT COUNT(DISTINCT Salary)
           FROM Employee AS e2
           WHERE e2.Salary > e1.Salary
           AND e1.DepartmentID = e2.DepartmentID
          )
ORDER BY
Department ASC,
Salary DESC;
Run Code Online (Sandbox Code Playgroud)
  1. 难的是拿到每个部门的前三名。我先算一下【工资较高的员工人数】

    之后,我使用3 > [工资较高的员工人数]只保留前 3 名的工资。(如果前3名员工超过3人,即部分工资相同,则全部计算在内。)

    询问

    SELECT *
    FROM Employee e1
    WHERE 3 > (
               SELECT COUNT(DISTINCT Salary)
               FROM Employee e2
               WHERE e2.Salary > e1.Salary
               AND e1.DepartmentID = e2.DepartmentID
              );
    
    Run Code Online (Sandbox Code Playgroud)

    输出

    +------+-------+--------+--------------+
    | Id   | Name  | Salary | DepartmentId |
    +------+-------+--------+--------------+
    |    1 | Joe   |  70000 |            1 |
    |    2 | Henry |  80000 |            2 |
    |    3 | Sam   |  60000 |            2 |
    |    4 | Max   |  90000 |            1 |
    |    6 | Randy |  85000 |            1 |
    +------+-------+--------+--------------+
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后是容易的部分。您可以将这个表与 DepartmentID 上的 Department 连接起来以获取部门名称。

    最终输出

    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT         | Max      |  90000 |
    | IT         | Randy    |  85000 |
    | IT         | Joe      |  70000 |
    | Sales      | Henry    |  80000 |
    | Sales      | Sam      |  60000 |
    +------------+----------+--------+
    
    Run Code Online (Sandbox Code Playgroud)