Как с помощью sql соединить два запроса с AVG для 2-х разных дат?
У меня есть 2 таблицы t1 и t2. Чтобы получить среднюю зарплату для каждого сотрудника в Марте пишу этот код.
select t2.name,
avg (t1.salary) as avg_salary_march
from t1
join t2 on t1.operator_name = t2.name
where date between '2023-03-01' and '2023-04-01'
group by t2.name
Но теперь мне надо сделать так, чтобы одновременно получить среднюю зарплату для каждого сотрудника за Март и Апрель и получить таблицу типа:
| name | avg_salary_march | avg_salary_april |
|---|---|---|
| A | 100 | 200 |
Пыталась написать код используя подзапросы:
select t2.name,
(select avg(salary) as avg_salary_march
from t1
where date between '2023-03-01' and '2023-04-01'),
(select avg(salary) as avg_salary_april
from t1
where date between '2023-04-01' and '2023-04-30')
from t1
join t2 on t1.operator_name = t2.name
where date between '2023-03-01' and '2023-04-30'
group by t2.ldap
Но в итоге получаю среднюю зарплату не для каждого сотрудника отдельно, а общее среднее значение за Март и общее среднее значение за Апрель.
Хочу показать 2-ой вариант(рабочий), где я использовала UNION:
select t2.name,
avg (t1.salary) as avg_salary_march
from t1
join t2 on t1.operator_name = t2.name
where date between '2023-03-01' and '2023-04-01'
group by t2.name
union all
select t2.name,
avg (t1.salary) as avg_salary_april
from t1
join t2 on t1.operator_name = t2.name
where date between '2023-04-01' and '2023-04-30'
group by t2.ldap
Результат этого запроса не удовлетворил меня тем, что не получила значения за Март и за Апрель в отдельных столбцах и получила такой result:
| name | avg_salary_march |
|---|---|
| A | 100 |
| A | 200 |
Нужен совет, какой код мне написать, чтобы получить результат как в первом примере? Спасибо заранее!
Ответы (1 шт):
Условное агрегирование.
select t2.name,
avg(CASE WHEN date between '2023-03-01' and '2023-03-31' THEN t1.salary END) as avg_salary_march,
avg(CASE WHEN date between '2023-04-01' and '2023-04-30' THEN t1.salary END) as avg_salary_april
from t1
join t2 on t1.operator_name = t2.name
where date between '2023-03-01' and '2023-04-30'
group by t2.name
Если за какой-то месяц данных нет - ожидаемо вернётся NULL.