Ответ 1
Короче, чем вопрос:
SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
У меня есть таблица EmpDetails
:
DeptID EmpName Salary
Engg Sam 1000
Engg Smith 2000
HR Denis 1500
HR Danny 3000
IT David 2000
IT John 3000
Мне нужно сделать запрос, чтобы найти самую высокую зарплату для каждого отдела.
Короче, чем вопрос:
SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
Предполагая, что 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)
Используйте следующий запрос:
select employee_name,salary,department_id from emp where salary in(select max(salary) from emp group by department_id);
Если вы хотите показать другие параметры вместе с DeptId
и Salary
как 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
ermn, что-то вроде:
select
d.DeptID,
max(e.Salary)
from
department d
inner join employees e on d.DeptID = e.DeptID
group by
d.DeptID
SELECT empname
FROM empdetails
WHERE salary IN(SELECT deptid max(salary) AS salary
FROM empdetails
group by 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 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 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
Есть ли лучшее решение, чем это?
Это лучшее решение для 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. Для каждого раздела.
Используйте следующую команду:
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
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);
***
> /*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////
Если вы просто хотите получить самую высокую зарплату из этой таблицы, отделом:
SELECT MAX(Salary) FROM TableName GROUP BY DeptID
Вот способ получить максимальные значения и имена для любой версии 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
Не самый элегантный, но он работает.
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.
select empno
from EMP e
where salary=(select max(sal)
from EMP w
where groupby w.deptno having e.deptno=w.deptno)
Я надеюсь, что это сработает...
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-й член группы.
Использовать коррелированный подзапрос:
SELECT DeptID, EmpName, Salary
FROM EmpDetails a
WHERE Salary = (SELECT MAX(Salary)
FROM EmpDetails b
WHERE a.DeptID = b.DeptID)
В приведенном ниже запросе будет отображаться имя сотрудника с соответствующим названием отдела, в котором это конкретное имя сотрудника имеет самую высокую зарплату.
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.
Не уверен, почему никто не упомянул группу By... Имея синтаксис. В нем конкретно рассматриваются эти требования.
select EmpName,DeptId,Salary from EmpDetails group by DeptId having Salary=max(Salary);
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;
ЕСЛИ вы хотите Департамент и самую высокую зарплату, используйте
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 (зарплата...)), например, один человек имеет одинаковую зарплату в другом отделе, тогда он потерпит неудачу.
В приведенном ниже запросе будет отображаться самая высокая зарплата в каждом отделе.
select deptname, max(salary) from department, employee where
department.deptno=employee.deptno group by deptname;
Я успешно выполнил этот запрос в базе данных Oracle.
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, в зависимости от разбиения по и по порядку. В конце концов, мы можем написать, где условие на основе наших требований.