【问题标题】:How do I select the workers who make more money than their leader within their respective department in sql?如何在sql中选择比他们各自部门的领导赚更多钱的工人?
【发布时间】:2020-10-22 01:57:22
【问题描述】:

我有下表:

+---------------------------------------------------+
| ID EMPNAME DEPARTMENT ROLE       SALARY   EXTRA   |
| 1  brian   10         sales      2000     500     |
| 2  jenny   10         leader     3000     100     |
| 3  sam     20         office     1500     500     |
| 4  cory    20         leader     1200     300     |
| 5  tifa    30         custservice4000     1000    |
| 6  sammy   30         leader     3000     200     |
| 7 anne     30         sales      4500     200     |
+---------------------------------------------------+

我的工作是在每个角色中找到比他们的领导(薪水+额外)赚更多的人。然后我将显示那个人的idempnamedepartment。我需要一种方法来比较每个部门内角色之间的薪水+额外费用(额外费用是他们每年的奖金)。我已经尝试过类似以下代码的方法,但它不起作用,它没有正确计算最高与领导者的关系。

SELECT a.id, a.empname, a.department
FROM MyTable a
JOIN (SELECT MAX(Salary + extra) As Highest, Dept FROM MyTable GROUP BY Dept) b
ON a.Dept = b.Dept && (a.Salary + a.extra) = b.Highest

如何在标准的前三列中显示他们比特定部门的领导赚得更多?上表应输出以下内容:

+-----------------------+
| ID EMPNAME DEPARTMENT |
| 3  sam     20         |
| 5  tifa    30         |
| 7  anne    30         |
+-----------------------+

这是在 sql developer 中完成的。

编辑:忘记补充EXTRA 的某些值可能是NULL

【问题讨论】:

    标签: mysql sql select


    【解决方案1】:

    嗯。 . .我在想一个相关的子查询:

    select t.*
    from mytable t
    where (t.salary + t.extra) > (select t2.salary + t2.extra
                                  from mytable t2
                                  where t2.department = t.department and
                                        t2.role = 'leader'
                                 );
    

    【讨论】:

    • 当我运行这个时,我得到一个空白表。我忘了提及,但某些薪水或额外价值可能为空。这就是它不起作用的原因吗?谢谢。
    • @BlackShard 。 . . (1) this 问题没有缺失值。 (2) 这些行将被过滤掉。如果缺少值,则不清楚如何进行比较。
    【解决方案2】:

    您可以在这里使用连接方法:

    SELECT mt1.id, mt1.empname, mt1.department
    FROM MyTable mt1
    INNER JOIN
    (
        SELECT department, salary + COALESCE(extra, 0) AS total
        FROM MyTable
        WHERE ROLE = 'leader'
    ) mt2
        ON mt1.department = mt2.department
    WHERE
        mt1.salary + COALESCE(mt1.extra, 0) > mt2.total;
    

    【讨论】:

    • 我忘了补充一些额外的值如果他们没有得到奖金可能是空的,这会影响结果吗?当我运行您的查询时,我得到了一张空白表。
    • @BlackShard 当然,只需将extraCOALESCE 包装起来,并在为空的情况下为其分配默认值零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多