10923679 Ответов: 7

Найдите самого высокооплачиваемого сотрудника из разных отделов


Название Отдела Заработной Платы
Джон это сделал
Сэм 50,000 CS
Джон это сделал


Мне нужна такая сумма

Название отдела заработной платы
Джон 70 000 это
Сэм 50,000 CS

тогда максимальная зарплата


Итак , ответ будет таким...
Название Отдела Заработной Платы
Джон 70 000 Это

В одном запросе

Что я уже пробовал:

select max(salary) from employee  where salary=(select name, sum(salary)  from employee   group by name)group by name,salary 

7 Ответов

Рейтинг:
2

OriginalGriff

Группировка по не работает так - чем больше столбцов вы добавляете в список групп, тем больше строк вы получаете, а не меньше. Видеть это: SQL GROUP By и ошибка "имя столбца недопустимо в списке выбора, потому что..." [^] - он объясняет групповые и агрегатные функции.

То, что вы хотите, это использовать GROUP BY и JOIN:

SELECT a.[Name], a.[Salary], a.Dept
FROM MyTable a
JOIN (SELECT MAX(Salary) As Highest, Dept FROM MyTable GROUP BY Dept) b
ON a.Dept = b.Dept && a.Salary = b.Highest


10923679

Он действительно работал для максимальной зарплаты, но не работал, чтобы добавить зарплату, если это для того же человека, как я упоминал в приведенном выше примере
Сумма(зарплата) не используется

Рейтинг:
2

Maciej Los

Вы должны использовать один из них ранжирующая функция[^]: РАНГ()[^- Почему? Потому что может быть больше одного работника с самой высокой зарплатой.

Попробовать это:

SELECT a.[Name], a.[Salary], a.[Dept]
FROM employee a INNER JOIN
(
    SELECT [Name], [Dept], [Salary], RANK() OVER(ORDER BY [Salary] DESC) AS [Rank]
    FROM employee 
) as b ON a.[Salary] = b.[Salary] AND a.[Name] = b.[Name] AND a.[Dept] = b.[Dept]
WHERE b.[Rank] = 1


CHill60

За(приказ [зарплата]) должно быть более(приказ [зарплата] по убыванию) ;-)

Maciej Los

Хорошая мысль!

Рейтинг:
2

MIKEMUNKHOLM

Это даст ответ, который вы ищете. Наслаждаться.

SELECT
    NAME,
    SALARY,
    DEPT
FROM
    (SELECT
        ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS ROWNUM,
        NAME,
        SALARY,
        DEPT
    FROM
        (SELECT
            NAME,
            SUM(SALARY) AS SALARY,
            DEPT
        FROM
            Employee
        GROUP BY
            NAME,
            DEPT
            )A
    )B
WHERE
    ROWNUM = 1


CHill60

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

Рейтинг:
1

chandan Panda

Если такая ситуация, как у вас есть данные о сотруднике и отделе в одной таблице, и вы должны оштрафовать самого высокооплачиваемого сотрудника из каждого отдела, то вы можете попробовать следующие решения

EmployeeId	EmployeeName	Department	   Salary
1	         Neeraj	        Dot Net	       45000
2	         Ankit	        Java	       5000
3	         Akshay    	    Java	       6000
4	         Ramesh	        Dot Net	       7600
5	         Vikas	        Java	       4000
7	         Neha	        Php	           8500
8	         Shivika	    Php	           4500
9	         Tarun	        Dot Net	       9500


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

Решение - 1
SELECT t.EmployeeName,t.Department,t.Salary FROM(SELECT MAX(Salary) AS TotalSalary,Department FROM Employee GROUP BY Department) AS TempNew  
Inner Join Employee t ON TempNew.Department=t.Department  
and TempNew.TotalSalary=t.Salary 
ORDER BY t.Department ASC


Решение -2
;WITH EmployeeDetails AS (
SELECT EmployeeName, Department, DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS SalaryRank, Salary
FROM Employee 
)
SELECT EmployeeName, Department, Salary FROM EmployeeDetails WHERE SalaryRank=1


ВЫХОД
EmployeeName	Department	Salary
Neeraj	         Dot Net	45000
Akshay	         Java	    6000
Neha	         Php	    8500


Рейтинг:
0

CHill60

Решение, которое вам нужно, - это комбинация всего вышеперечисленного, оно только усложняется, потому что сначала нужно суммировать зарплаты (вероятно, не самый лучший дизайн базы данных, если честно).

К сожалению, функции окна SQL (например RANK()) не может быть использован в WHERE поэтому нам нужен еще один подзапрос или CTE.

Эта работа:

;WITH rankings AS
(
	SELECT [Name], Dept, TotSalary, RANK() OVER (PARTITION BY Dept ORDER BY TotSalary DESC) as r
	FROM (	SELECT [Name], Dept, SUM(Salary) AS TotSalary 
			FROM Employee GROUP BY Dept, [Name]) q 
)
SELECT [Name], Dept, TotSalary FROM rankings where r = 1
Эта версия сначала суммирует зарплату по отделам и названиям (в случае, если люди с одинаковым именем находятся в разных отделах - кстати, есть подсказка относительно схемы таблицы).

Затем он ранжирует зарплаты, потому что, как заявил @Maciej-Los, более одного сотрудника может заработать одну и ту же сумму (хотя решение @OriginalGriff имеет аналогичный эффект из-за пункта WHERE).

Наконец, все это входит в CTE (это мог быть подзапрос), так что мы можем выбрать только самую высокую общую зарплату.

[EDIT - комментарии к решению 3 заставили меня перечитывать вопрос, и я понял, что вам нужна не самая высокая зарплата по отделам, а только самая высокая зарплата в целом. К вам, что просто удалить раздел с отделом
;WITH rankings AS
(
	SELECT [Name], Dept, TotSalary, RANK() OVER (ORDER BY TotSalary DESC) as r
	FROM (	SELECT [Name], Dept, SUM(Salary) AS TotSalary 
			FROM Employee GROUP BY Dept, [Name]) q 
)
SELECT [Name], Dept, TotSalary FROM rankings where r = 1


Рейтинг:
0

Pavan Kumar Chiluveru

SELECT TOP(1) name,dept,SUM(salary) AS sal FROM employee GROUP BY name,dept ORDER BY sal DESC


CHill60

Как я уже сказал в комментариях к вашему предыдущему ответу...- А что, если существует более одного человека с такой же самой высокой зарплатой? (См. слова в решении 2)".
Не публикуйте несколько решений для одного вопроса - в лучшем случае это сбивает с толку, в худшем-рассматривается как охота за репостами. Используйте Улучшите решение ссылка, Если вы хотите изменить подход или, по крайней мере, удалить свое исходное решение

Рейтинг:
0

Member 14831982

Если у вас есть какая либо одинаковая зарплата для 2 или более сотрудников функция Rank пропустит ранг лучшим решением является использование Dense_Rank() :

Выберите * из списка (
Выберите EmployeeName, отдел,зарплата , DENSE_RANK() над(раздел по заказу Департамента по убыванию зарплаты) как DenseRank
от сотрудников
)в результате

Где DenseRank =1 ;


Richard Deeming

RANK будет НИКОГДА пропустите первое значение.

Если бы вы искали то второй самый высокооплачиваемый сотрудник, то его нужно было бы использовать DENSE_RANK Но это домашнее задание искал самый высокооплачиваемый сотрудник, так что RANK это совершенно нормально, и решения 1 и 2 верны.