Я не понимаю логику того, как выполнить группировку по отделам и найти среднюю зарплату отдела, а затем отфильтровать все строки таблицы по значениям, превышающим среднюю зарплату этого отдела в SQL.
Отделение | Зарплата |
---|---|
А | 100 |
Б | 200 |
А | 200 |
Б | 50 |
Таким образом, среднее значение группы А равно 150. а средний балл группы B равен 125. Мой запрос должен вернуть: -
Отделение | Зарплата |
---|---|
Б | 200 |
А | 200 |
Вы должны посмотреть, как работает группировка в SQL. Этот запрос найдет отдел и его среднюю зарплату:
SELECT department, AVG(salary) salary FROM yourtable
GROUP BY department;
Чтобы найти отделы с более высокой зарплатой, вы можете просто соединить всю таблицу и этот «средний результат» и выбрать только те записи, у которых зарплата выше:
SELECT y.department, y.salary FROM yourtable y
JOIN (SELECT department, AVG(salary) salary FROM yourtable
GROUP BY department) average
ON y.department = average.department
WHERE y.salary > average.salary
ORDER BY y.department;
Предложение заказа позволяет отделу А появиться перед отделом Б. В вашем описании он отсортирован по-другому. Если вы хотите изменить это, вы можете написать ORDER BY y.department DESC; Последнее замечание: если в таблице окладов есть значения NULL, они не будут учитываться функцией среднего значения. Итак, если у вас есть 10 нулевых значений, одна строка с зарплатой 100 и одна с зарплатой 50, среднее значение будет 75 и «игнорировать» значения NULL. Если вы этого не хотите, вам нужно заменить значения NULL нужным вам значением. Например, вы можете написать COALESCE(salary,0) в своем запросе, если хотите заменить все значения NULL на ноль при расчете средней зарплаты.