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.
Aussi court que la question:
SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
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;
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
SELECT empName,empDept,EmpSalary
FROM Employee
WHERE empSalary IN
(SELECT max(empSalary) AS salary
From Employee
GROUP BY EmpDept)
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);
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)
SELECT
DeptID,
Salary
FROM
EmpDetails
GROUP BY
DeptID
ORDER BY
Salary desc
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à?
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
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;
SELECT empname
FROM empdetails
WHERE salary IN(SELECT deptid max(salary) AS salary
FROM empdetails
group by deptid)
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);
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
***
> /*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////
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
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);
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 ...
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.
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)
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.
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.
Si vous souhaitez simplement obtenir le salaire le plus élevé de cette table, par département:
SELECT MAX(Salary) FROM TableName GROUP BY DeptID
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.
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.
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;
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.