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