2012-11-27 94 views
1

在采访中一人问我如下问题选择,它们是在该部门的最高薪水各部门全体员工

“编写一个查询,找出它们是具有最高的薪水各部门全体员工在部门名称,员工姓名和工资部门“

这意味着员工表中有100条记录,部门表中有10条记录。 所以它需要从查询中给我10条记录,如果在任何部门没有员工,它仍然需要显示部门名称。

感谢

+5

表结构将有帮助... – eggyal

回答

0

该查询给你部门的名单,与该部门的最高工资支付,如果存在,否则返回null。在这种情况下,选择员工姓名不会给你正确的姓名,只需返回链接部门的第一名员工!

SELECT 
    d.name, 
    MAX(e.salary) 
FROM 
    department d 
LEFT OUTER JOIN employee e ON (e.department_id = d.id) 
GROUP BY d.id 

查看SQL Fiddle

如果您希望的部门列表最高工资和员工姓名:

SELECT 
    d.name, 
    e.name, e.salary 
FROM 
    department d 
LEFT OUTER JOIN employee e ON (e.department_id = d.id) 
WHERE e.salary IN (
    SELECT MAX(em.salary) FROM employee em 
    WHERE em.department_id = d.id 
); 

查看SQL Fiddle

5

没有看到一个表结构,我会说,你很可能做一些不同的方法。

使用的IN条款:

select e.name e_name, 
    d.name d_name, 
    e.salary 
from employee e 
inner join department d 
    on e.deptid = d.id 
where e.salary in (select max(salary) 
        from employee 
        group by deptid); 

或使用子查询:

select e1.name e_name, 
    d.name d_name, 
    e1.salary 
from employee e1 
inner join 
(
    select max(salary) salary, deptid 
    from employee 
    group by deptid 
) e2 
    on e1.salary = e2.salary 
    and e1.deptid = e2.deptid 
inner join department d 
    on e1.deptid = d.id 

见两个

现在SQL Fiddle with Demo,MySQL允许你申请一个聚合函数,而不是应用GROUP BY到选择列表中的非聚合字段(这不能在sql server,oracle等中完成)。所以,你可以用它来获得相同的结果:

select e.name e_name, 
    d.name d_name, 
    max(e.salary) salary 
from employee e 
inner join department d 
    on e.deptid = d.id 
group by d.name 

SQL fiddle with Demo

2
Table "emp" has 
id, name,d_id,salary 
and Table "department" has 
id, dname 

领域。

下面的查询将输出higest用部门名称

SELECT E.id, 
      E.name, 
      D.dname, 
      max(E.salary) as higest_salary 
    FROM `emp` as E 
      left join department as D 
    on D.id=E.d_id 
    group by E.d_id 
0

工资对于SQL Server 2008 不是最佳的解决方案......但完全在HR数据库工作从Oracle 10G

Screen Shot of Result of Below Code

select e.DEPARTMENT_ID,d.MaxSalary,es.FIRST_NAME,dm.MinSalary,esd.FIRST_NAME 
from EMPLOYEES e 
join (select department_id,MAX(salary) MaxSalary from EMPLOYEES group by DEPARTMENT_ID) d 
on e.DEPARTMENT_ID=d.DEPARTMENT_ID 
join (select first_name,DEPARTMENT_ID from EMPLOYEES ess where SALARY in (select MAX(salary) from EMPLOYEES where DEPARTMENT_ID=ess.DEPARTMENT_ID)) es 
on e.DEPARTMENT_ID=es.DEPARTMENT_ID 
join (select department_id,min(salary) MinSalary from EMPLOYEES group by DEPARTMENT_ID) dm 
on e.DEPARTMENT_ID=dm.DEPARTMENT_ID 
join (select first_name,DEPARTMENT_ID from EMPLOYEES ess where SALARY in (select min(salary) from EMPLOYEES where DEPARTMENT_ID=ess.DEPARTMENT_ID)) esd 
on e.DEPARTMENT_ID=esd.DEPARTMENT_ID 
group by e.DEPARTMENT_ID,d.MaxSalary,es.FIRST_NAME,dm.MinSalary,esd.FIRST_NAME 
迁移
+0

这个问题是关于MySQL –

-1

选择empname,MAX(salary)从employee GROUP BY dep_id

上面的查询会生成一个准确的结果。

+1

不,它不会 - 它只会查找雇员的最高工资*全部*雇员。 – Glorfindel

-1

从emp中选择ename,其中薪水在(按部门选择emp组中的max(salary));

相关问题