【问题标题】:select max salary in sql在sql中选择最高薪水
【发布时间】:2013-09-26 20:58:58
【问题描述】:

工作表

id          ename
----------- ----------
1           apv
2           sug
3           raj
4           ram
5           sam
6           apv1
7           sug1
8           raj1
9           ram1
10          sam1

部门表

dept  salary      id
----- ----------- -----------
a     1000        1
b     2000        2
c     3000        3
d     5000        4
e     7000        5
a     20000       6
b     500         7
c     5000        8
a     1000        9
b     90000       10

如何返回每个部门的Max(salary) 以及获得该薪水的人员的详细信息? (选择 id,ename,dept,salary)

【问题讨论】:

  • 你能用问题的形式重新表述一下吗?
  • 您是否尝试编写查询来执行此操作,还是希望我们为您考虑?
  • 按部门从员工组中选择最高薪水。也许?
  • 你的桌子设计得很糟糕。为什么员工的工资会在 dept 表中?
  • @Victor - 我认为加入应该在id 上。 @syrion - 你已经标记了 MySQLSQL Server 你的答案是否需要在两者中都有效(最小公分母)?

标签: mysql sql sql-server


【解决方案1】:
select mm, d1.dept, d1.id, ename from DEPT D1,
(select max(salary) mm, dept from DEPT group by dept) D2, EMP 
where D2.mm=d1.salary and d2.dep=d1.dept
EMP.ID=DEPT.ID

【讨论】:

  • 目前为止最好的,但我认为你还需要and d2.dept = d1.dept;否则,如果 A 部门的最高员工收入为 10000,则查询还将返回其他部门中收入为 10000 的所有其他员工,即使他们不是该部门的最大值。 (最后一个DEPT.ID 应该是D1.ID。)
【解决方案2】:
declare @Emp table (id int, ename varchar(4))
declare @Dept table (dept char(1), salary int, id int)

insert into @Emp values
(1,           'apv'),
(2,           'sug'),
(3,           'raj'),
(4,           'ram'),
(5,           'sam'),
(6,           'apv1'),
(7,           'sug1'),
(8,           'raj1'),
(9,           'ram1'),
(10,          'sam1')

insert into @Dept values
('a',     1000,        1),
('b',     2000,        2),
('c',     3000,        3),
('d',     5000,        4),
('e',     7000,        5),
('a',     20000,       6),
('b',     500,         7),
('c',     5000,        8),
('a',     1000,        9),
('b',     90000,       10)

;with cte as
(
  select
    id,
    salary,
    dept,
    rank() over(partition by dept order by salary desc) as rn
  from @Dept
)
select
  e.ename,
  e.id,
  c.salary,
  c.dept
from cte as c
  inner join @Emp as e
    on c.id = e.id
where rn = 1

结果

ename id          salary      dept
----- ----------- ----------- ----
apv1  6           20000       a
sam1  10          90000       b
raj1  8           5000        c
ram   4           5000        d
sam   5           7000        e

【讨论】:

  • 很好,但我不认为这与部门中的工资关系有关?
  • @Rup 这取决于你想要什么。使用rank,您将获得所有分享最高薪水的人。如果你只想要其中一个,你应该改用row_number
【解决方案3】:

先按部门预查询,然后在同一部门和匹配的工资上返回自身。从那个表中,您可以绑定到员工表。此版本将允许同一部门的多个同薪人员被拉出...例如:X 部门的 5 人收入 75,000。

SELECT
      d1.Dept,
      d1.Salary,
      Emp.id,
      Emp.name
   from 
      ( SELECT
              dept,
              MAX(salary) MaxSal
           from 
              Dept
           group by 
              dept ) ByDept
      join Dept d1
         ON ByDept.dept = d1.dept
         and ByDept.MaxSal = d1.Salary
         join Emp
            ON d1.id = Emp.id

【讨论】:

    【解决方案4】:

    我不知道我是否完全理解您,但您可以尝试以下方式:

       SELECT id, ename, dept, MAX(salary) AS salary
         FROM Dept_Table AS d
    LEFT JOIN Emp_Table AS e
           ON e.id = d.id
     GROUP BY dept
    

    【讨论】:

    • 看起来不错,但为什么是 LEFT JOIN 而不是 INNER JOIN ?
    • 我认为这行不通-您选择的非聚合列比分组依据多,而且我认为它不会像您期望的那样拉入最大记录。如果给定部门的两名员工的最高工资相同怎么办?
    【解决方案5】:
    select dept.dept, max(dept.salary), emp.id, emp.ename
    from emp inner join dept on emp.id=dept.id
    group by dept.dept, emp.id, emp.ename
    

    应该做的伎俩,只要知道如果同一部门的两个人有相同的薪水并且这是最高薪水,那么你将把两个人都作为outout。

    【讨论】:

    • 不,这样分组太多了——如果员工可能有两个部门表记录,它会返回每个员工的最高工资。
    【解决方案6】:

    SELECT emp.ename,dept.dept,max(dept.salary) from dept left join emp on dept.id=emp.id group by dept.dept

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多