Самая высокая зарплата в каждом отделе

У меня есть таблица EmpDetails:

DeptID      EmpName   Salary
Engg        Sam       1000
Engg        Smith     2000
HR          Denis     1500
HR          Danny     3000
IT          David     2000
IT          John      3000

Мне нужно сделать запрос, чтобы найти самую высокую зарплату для каждого отдела.

Ответ 1

Короче, чем вопрос:

SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID

Ответ 2

Предполагая, что SQL Server 2005 +

WITH cteRowNum AS (
    SELECT DeptID, EmpName, Salary,
           DENSE_RANK() OVER(PARTITION BY DeptID ORDER BY Salary DESC) AS RowNum
        FROM EmpDetails
)
SELECT DeptID, EmpName, Salary
    FROM cteRowNum
    WHERE RowNum = 1;

Ответ 3

Select empname,empid,Sal,DeptName from 
(Select e.empname,e.empid,Max(S.Salary) Sal,D.DeptName, ROW_NUMBER() Over(partition by D.DeptName order by s.salary desc) Rownum
from emp e inner join Sal S
on e.empid=s.empid 
inner join Dept d on e.Deptid=d.Deptid
group by e.empname,e.empid,D.DeptName,s.Salary
) x where Rownum = 1

Ответ 4

SELECT empName,empDept,EmpSalary
FROM Employee
WHERE empSalary IN
  (SELECT max(empSalary) AS salary
   From Employee
   GROUP BY EmpDept)

Ответ 5

Используйте следующий запрос:

select employee_name,salary,department_id from emp where salary in(select max(salary) from emp group by department_id);

Ответ 6

Если вы хотите показать другие параметры вместе с DeptId и Salary как EmpName, EmpId

SELECT 
        EmpID 
      , Name, 
      , Salary
      , DeptId 
   FROM Employee 
   where 
     (DeptId,Salary) 
     in 
     (select DeptId, max(salary) from Employee group by DeptId)

Ответ 7

SELECT
    DeptID,
    Salary
FROM
    EmpDetails
GROUP BY
    DeptID
ORDER BY
    Salary desc

Ответ 8

ermn, что-то вроде:

select 
   d.DeptID,
   max(e.Salary)
from
   department d
   inner join employees e on d.DeptID = e.DeptID
group by
  d.DeptID

Ответ 9

SELECT empname
FROM empdetails
WHERE salary IN(SELECT deptid max(salary) AS salary
FROM empdetails
group by deptid)

Ответ 10

WITH cteRowNum AS (
    SELECT DeptID, EmpName, Salary,
           ROW_NUMBER() OVER(PARTITION BY DeptID ORDER BY Salary DESC) AS RowNum
        FROM EmpDetails
)
SELECT DeptID, EmpName, Salary,Rownum
    FROM cteRowNum
    WHERE RowNum in(1,2);

Ответ 11

select a.*
 from EmpDetails a
 inner join 
 (
 select DeptID,max(Salary) as Salary
 from EmpDetails group by DeptID  
 )b 
on a.DeptID = b.DeptID and a.Salary = b.Salary

Ответ 12

SELECT Employee_ID
     , First_name
     , last_name
     , department_id
     , Salary 
FROM (SELECT Employee_ID
           , First_name
           , last_name
           , department_id
           , Salary
           , MAX(salary) OVER (PARTITION BY department_id) dept_max_sal
      FROM EMPLOYEES) AS Emp
WHERE salary = dept_max_sal;

Ответ 13

Это будет работать, если департамент, зарплата и имя сотрудника находятся в одной таблице.

select ed.emp_name, ed.salary, ed.dept from
(select max(salary) maxSal, dept from emp_dept group by dept) maxsaldept
inner join emp_dept ed
on ed.dept = maxsaldept.dept and ed.salary = maxsaldept.maxSal

Есть ли лучшее решение, чем это?

Ответ 14

Это лучшее решение для ORACLE:

Select * from (select customerid, city, freight,
row_number() over (partition by customerid order by freight desc) Row_Number from 
(select orders.orderId, customers.CUSTOMERID, customers.city, orders.FREIGHT from orders inner join customers on orders.customerid = customers.customerid where customers.country='Germany' order by customers.customerid, orders.freight desc) 
order by customerid, freight desc) where Row_Number<=2;

Обратите внимание, что я использовал предложение partition by для маркировки номера строки, это главным образом потому, что нам нужно разбить группы записей, группируя их по идентификатору клиента. Здесь я использовал два внутренних запроса. Самый внутренний запрос - это дать представление, которое сортируется в соответствии с идентификатором клиента и снижением порядка стоимости. Теперь из этого нам нужно получить всегда две верхние записи, поэтому сначала нам нужно их назвать, а затем нам нужно отфильтровать их в соответствии с rownum. Запрос второго уровня - это отметка rownum в соответствии с идентификатором клиента. И окончательный запрос будет фильтровать результат в соответствии с rownum. Для каждого раздела.

Ответ 15

Используйте следующую команду:

SELECT  A.*
    FROM    @EmpDetails A
            INNER JOIN ( SELECT DeptID ,
                                MAX(salary) AS salary
                         FROM   @EmpDetails
                         GROUP BY DeptID
                       ) B ON A.DeptID = B.DeptID
                              AND A.salary = B.salary
    ORDER BY A.DeptID

Ответ 16

SELECT D.DeptID, E.EmpName, E.Salary
FROM Employee E
INNER JOIN Department D ON D.DeptId = E.DeptId
WHERE E.Salary IN (SELECT MAX(Salary) FROM Employee);

Ответ 17

***

> /*highest salary by each dept*/

***
select d.Dept_Name,max(e.salary)
    from emp_details as e join Dept_Details as d
    on e.d_id=d.Dept_Id
    group by  d.Dept_Name

select  distinct e.d_id,d.Dept_Name
    from emp_details as e join Dept_Details as d 
    on e.d_id=d.Dept_Id

select  e.salary,d.Dept_Name,d.Dept_Id
    from emp_details as e join Dept_Details as d 
    on e.d_id=d.Dept_Id

/////simplest query for max salary dept_wise////

Ответ 18

Если вы просто хотите получить самую высокую зарплату из этой таблицы, отделом:

SELECT MAX(Salary) FROM TableName GROUP BY DeptID

Ответ 19

Вот способ получить максимальные значения и имена для любой версии SQL.

Данные теста:

CREATE TABLE EmpDetails(DeptID VARCHAR(10), EmpName VARCHAR(10), Salary DECIMAL(8,2))
INSERT INTO EmpDetails VALUES('Engg','Sam',1000)
INSERT INTO EmpDetails VALUES('Engg','Smith',2000)
INSERT INTO EmpDetails VALUES('HR','Denis',1500)
INSERT INTO EmpDetails VALUES('HR','Danny',3000)
INSERT INTO EmpDetails VALUES('IT','David',2000)
INSERT INTO EmpDetails VALUES('IT','John',3000)

Пример:

SELECT ed.DeptID
      ,ed.EmpName
      ,ed.Salary
FROM (SELECT DeptID, MAX(Salary) MaxSal
      FROM EmpDetails
      GROUP BY DeptID)AS empmaxsal
INNER JOIN EmpDetails ed
  ON empmaxsal.DeptID = ed.DeptID
 AND empmaxsal.MaxSal = ed.Salary

Не самый элегантный, но он работает.

Ответ 20

SELECT DeptID, MAX(Salary)
 FROM EmpDetails
GROUP BY DeptID

Этот запрос будет работать нормально, но в тот момент, если вы хотите получить некоторые другие данные, связанные с работником, имеющим самую высокую зарплату, будут противоречить. Вы можете использовать:

SELECT DepatID, a , b, c
 FROM EmpDetails
 WHERE Salary IN (
    SELECT max(Salary)
      FROM EmpDetails
     GROUP BY DeptID
 );

если вы будете использовать предыдущий запрос, он будет отображать только записи min val, кроме зарплаты, поскольку вы использовали функцию max.

Ответ 21

select empno 
from EMP e 
where salary=(select max(sal) 
              from EMP w 
              where  groupby w.deptno having e.deptno=w.deptno)

Я надеюсь, что это сработает...

Ответ 22

select deptid, empname, salary from
(Select deptid, empname,salary,
rank() Over(Partition by deptid  order by salary desc)as rank from 
EmpDetails) emp 
where emp.rank = 1

Сначала ранжирует каждого сотрудника по зарплате в порядке убывания с наивысшим ранг 1, а затем выбирает только дептид, empname, зарплату. Вы можете сделать это для все N-й член группы.

Ответ 23

Использовать коррелированный подзапрос:

SELECT DeptID, EmpName, Salary
FROM EmpDetails a
WHERE Salary = (SELECT MAX(Salary) 
                FROM EmpDetails b
                WHERE a.DeptID = b.DeptID)

Ответ 24

В приведенном ниже запросе будет отображаться имя сотрудника с соответствующим названием отдела, в котором это конкретное имя сотрудника имеет самую высокую зарплату.

with T as
(select empname, employee.deptno, salary
from employee
where salary in (select max(salary)
from employee
group by deptno))
select empname, deptname, salary
from T, department
where T.deptno=department.deptno;

Я успешно выполнил вышеуказанный запрос в базе данных Oracle.

Ответ 25

Не уверен, почему никто не упомянул группу By... Имея синтаксис. В нем конкретно рассматриваются эти требования.

select EmpName,DeptId,Salary from EmpDetails group by DeptId having Salary=max(Salary);

Ответ 26

select * from (
    select a.* from EmpDetails a 
    right join (select DeptID,max(salary) as Salary from EmpDetails group by DeptID) b
    on b.DeptID=a.DeptID and b.salary=a.salary ) as c  group by c.DeptID;

Ответ 27

ЕСЛИ вы хотите Департамент и самую высокую зарплату, используйте

SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID

Если вы хотите больше столбцов у сотрудника и отдела, используйте

select  Department.Name , emp.Name, emp.Salary from Employee emp
inner join (select DeptID, max(salary) [salary] from employee group by DeptID) b
on emp.DeptID = b.DeptID and b.salary = emp.Salary
inner join Department on emp.DeptID = Department.id
order by Department.Name

если использовать зарплату в (выберите max (зарплата...)), например, один человек имеет одинаковую зарплату в другом отделе, тогда он потерпит неудачу.

Ответ 28

В приведенном ниже запросе будет отображаться самая высокая зарплата в каждом отделе.

select deptname, max(salary) from department, employee where 
  department.deptno=employee.deptno group by deptname;

Я успешно выполнил этот запрос в базе данных Oracle.

Ответ 29

with ctesal as (
 select DepartmentId , Name , Salary, ROW_Number() OVER (partition by DepartmentId 
 order by Salary desc) as RowNum
 from dbo.Employee
 )
 select DepartmentId , Name , Salary , RowNum from ctesal where RowNum  =2;

Это применимо к серверу SQL. ROW_Number - это встроенная функция в SQL-сервере. Она дает счетчик, начиная с 1, в зависимости от разбиения по и по порядку. В конце концов, мы можем написать, где условие на основе наших требований.