Сколько зарабатывает сотрудник?
select person_id, sum(salary)
from works
group by person_id;
Мы можем даже расширить это, чтобы увидеть, является ли это сотрудник малого банка:
select
person_id,
sum(salary),
max(case when Company_Id =
(select Company_Id from company where company_name = 'Small Bank Co-Operation')
then 1 else 0 end
) as is_small_banker
from works
group by person_id;
Теперь используйте это для сравнения:
with salaries as
(
select
person_id,
sum(salary) as total,
max(case when Company_Id =
(select Company_Id from company where company_name = 'Small Bank Co-Operation')
then 1 else 0 end
) as is_small_banker
from works
group by person_id
)
select e.person_name
from employee e
join salaries s on s.person_id = e.person_id
where total > all
(
select total
from salaries
where is_small_banker = 1
)
order by e.person_name;
Это всего лишь один из способов сделать это. Вы можете сделать то же самое, например, с NOT EXISTS
(т.е. там, где не существует работника малого банка с такой же или более высокой зарплатой).
Обновить
Тем временем вы отметили свой запрос с сервером SQL и сказал мне, что вы получаете эту ошибку:
Msg 130, Level 15, State 1, Line 126 Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос
Очевидно, SQL Сервер имеет проблемы с условным агрегированием. Вы можете обойти это, присоединившись к таблице compabny вместо этого:
with salaries as
(
select
w.person_id,
sum(w.salary) as total,
max(case when c.company_name = 'Small Bank Co-Operation' then 1 else 0 end
) as is_small_banker
from works w
join company c on c.company_Id = w.company_Id
group by w.person_id
);
Обновление 2
Если в таблице works
может быть только одна работа (компания и зарплата) на сотрудника, весь запрос уменьшится до:
select e.person_name
from employee e
join works w on w.person_id = e.person_id
where salary > all
(
select salary
from works
where id_company =
(select company_Id from company where company_name = 'Small Bank Co-Operation')
)
order by e.person_name;