我正在尝试在线解决有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的解释,并会有所帮助.
如果您添加了一列, 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)
难的是拿到每个部门的前三名。我先算一下【工资较高的员工人数】。
之后,我使用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)然后是容易的部分。您可以将这个表与 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)| 归档时间: |
|
| 查看次数: |
9293 次 |
| 最近记录: |