【问题标题】:Select maximum value from one column by second column从一列到第二列中选择最大值
【发布时间】:2015-02-13 19:54:16
【问题描述】:

我有两张桌子:

EMPLOYEES
=====================================================
ID    NAME    SUPERVISOR    LOCATION    SALARY
-----------------------------------------------------
34       John                  AL          100000
17       Mike    34            NY          75000
5        Alan    34            LE          25000
10       Dave    5             NY          20000

BONUS
========================================
ID        Bonus
----------------------------------------
17        5000
34        5000
10        2000

我必须编写查询返回每个位置的最高薪员工列表,包括他们的姓名、薪水和薪水+奖金。排名应该基于工资加奖金。所以我写了这个查询:

select em.name as name, em.salary as salary, bo.bonus as bonus, max(em.salary+bo.bonus) as total
from employees as em
join bonus as bo on em.empid = bo.empid 
group by em.location

但是我得到了错误的名字并且查询不返回没有奖金的员工(empid = 5 在员工表中),根据位置(25000 + 0 奖金)具有最高工资。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以这样做

    select 
      em.location, 
      em.name as name, 
      em.salary as salary, 
      IFNULL(bo.bonus,0)) as bonus, 
      max(em.salary+IFNULL(bo.bonus,0)) as total
    from employees as em
    left join bonus as bo on em.empid = bo.empid 
    group by em.location;
    

    但是,此查询依赖于特定于 MySQL 的 group by 行为,并且在大多数其他数据库中会失败(如果启用了设置 ONLY_FULL_GROUP_BY,在 MySQL 的更高版本中也会失败)。

    我建议使用如下查询:

    select 
      em.location, 
      em.name as name, 
      em.salary as salary, 
      IFNULL(bo.bonus,0)) as bonus, 
      highest.total
    from employees as em 
    left join bonus as bo on em.empid = bo.empid 
    join (
        select 
          em.location, 
          max(em.salary+IFNULL(bo.bonus,0)) as total
        from employees as em 
        left join bonus as bo on em.empid = bo.empid 
        group by em.location
    ) highest on em.LOCATION = highest.LOCATION and em.salary+IFNULL(bo.bonus,0) = highest.total;
    

    您可以在此处确定每个地点的最高薪水+奖金,并将该结果用作联接中的派生表,以过滤出每个地点的总数最高的员工。

    看到这个SQL Fiddle

    【讨论】:

      【解决方案2】:

      也许尝试使用left join:

      select em.name as name, em.salary as salary, bo.bonus as bonus, max(em.salary+bo.bonus) as total
      from employees as em
      left join bonus as bo on em.empid = bo.empid 
      group by em.location
      

      【讨论】:

      • 是的,这是有效的,但对于没有奖金的员工,我得到的总数(空)不仅仅是薪水
      【解决方案3】:

      应该是:

      select 
         em.name as name, 
         em.salary as salary, 
         COALESCE(bo.bonus,0) as bonus, 
         max(em.salary + COALESCE(bo.bonus,0) ) as total
      from employees as em
      left join bonus as bo on em.empid = bo.empid 
      group by em.location
      

      您可以在SQLFiddle查看它

      【讨论】:

        【解决方案4】:

        请试试这个:

         select em.name as name, em.salary as salary,ISNULL(bo.bonus,0) as bonus,
             max(em.salary+ISNULL(bo.bonus,0)) as total
            from employees as em
            left join bonus as bo on em.ID = bo.ID 
            group by  em.name,em.salary, bo.bonus order by MAX(em.salary+ISNULL(bo.bonus,0)) Desc
        

        【讨论】:

        • ISNULL 接受一个参数。应该是 IFNULLCOALESCE 而不是
        猜你喜欢
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2014-05-11
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多