web-dev-qa-db-fra.com

Salaire le plus élevé dans chaque département

J'ai une table EmpDetails:

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

Je dois faire une requête qui trouve le salaire le plus élevé pour chaque département.

16
Qinnovator

Aussi court que la question:

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

En supposant que 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;
19
Joe Stefanelli
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
5
Dinesh
SELECT empName,empDept,EmpSalary
FROM Employee
WHERE empSalary IN
  (SELECT max(empSalary) AS salary
   From Employee
   GROUP BY EmpDept)
3
Prem Ranjan Jha

Utilisez la requête ci-dessous:

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

Si vous voulez aussi afficher d'autres paramètres avec DeptId et Salary comme EmpName, EmpId

SELECT 
        EmpID 
      , Name, 
      , Salary
      , DeptId 
   FROM Employee 
   where 
     (DeptId,Salary) 
     in 
     (select DeptId, max(salary) from Employee group by DeptId)
3
Ankit Sharma
SELECT
    DeptID,
    Salary
FROM
    EmpDetails
GROUP BY
    DeptID
ORDER BY
    Salary desc
2
naveen

Cela fonctionnera si le département, le salaire et le nom de l'employé sont dans la même table.

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

Y a-t-il une meilleure solution que celle-là?

2
vijayinani
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
2
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;
2
Vikas
SELECT empname
FROM empdetails
WHERE salary IN(SELECT deptid max(salary) AS salary
FROM empdetails
group by deptid)
2
Waseem M Soudagar
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);
2
Satish Wadekar

ermn, quelque chose comme:

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

> /*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////
2
PankajN

C'est la meilleure solution possible pour 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;

Remarquez que j'ai utilisé partition par clause pour marquer le numéro de ligne. Ceci est principalement dû au fait que nous devons partitionner les enregistrements en les regroupant en fonction de l'ID client. J'ai utilisé deux requêtes intérieures ici. La requête la plus interne consiste à donner une vue triée par ID client et par ordre décroissant de coût. Maintenant, à partir de là, nous devons toujours obtenir les deux premiers enregistrements. Nous devons d’abord les nommer, puis les filtrer en fonction de rownum. La requête de deuxième niveau consiste à marquer rownum en fonction de l'ID client. Et la requête finale va filtrer le résultat en fonction de rownum. Pour chaque partition.

Utilisez la commande suivante.

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
2
user5276129
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);
2
sushil dwivedi
select empno 
from EMP e 
where salary=(select max(sal) 
              from EMP w 
              where  groupby w.deptno having e.deptno=w.deptno)

J'espère que ça va marcher ...

1
aromita sen
SELECT DeptID, MAX(Salary)
 FROM EmpDetails
GROUP BY DeptID

Cette requête fonctionnera bien, mais si vous voulez récupérer d'autres informations relatives au salarié ayant le salaire le plus élevé, le moment où vous voudrez en venir à se contredire… 

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

si vous utilisez la requête précédente, elle ne reflètera que les enregistrements de la valeur minimale, à l'exception du salaire, car vous avez utilisé la fonction max.

1

Utilisez une sous-requête corrélée:

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

La requête ci-dessous affiche le nom de l'employé avec son nom de département respectif dans lequel le nom de cet employé a le salaire le plus élevé.

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;

J'ai exécuté la requête ci-dessus avec succès sur la base de données Oracle.

1
Puneet Agrawal
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

D’abord, chaque employé est classé par ordre décroissant de salaire dans le rang le plus élevé, puis le rang 1, puis ne sélectionne que deptid, empname, salaire. Vous pouvez le faire pour All Neme membre du groupe. 

1
Dwipam Katariya

Si vous souhaitez simplement obtenir le salaire le plus élevé de cette table, par département:

SELECT MAX(Salary) FROM TableName GROUP BY DeptID
1
swiftcode

Voici un moyen d’obtenir un maximum de valeurs et de noms sur n’importe quelle version de SQL.

Données de test:

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)

Exemple:

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

Pas le plus élégant, mais ça marche.

1
Mack

SI vous voulez le département et le salaire le plus élevé, utilisez

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

si vous voulez plus de colonnes dans employé et service, utilisez

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

si vous utilisez salaire dans (sélectionnez max (salaire ...)) comme ceci, une personne a le même salaire dans un autre département, elle échouera.

0
Arun Raj
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;
0
Ashraf Nawaz

La requête ci-dessous énumère le salaire le plus élevé dans chaque département.

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

J'ai exécuté cette requête avec succès sur la base de données Oracle.

0
Puneet Agrawal