Как с помощью sql соединить два запроса с AVG для 2-х разных дат?

Рейтинг: 1Ответов: 1Опубликовано: 26.04.2023

У меня есть 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

Нужен совет, какой код мне написать, чтобы получить результат как в первом примере? Спасибо заранее!

Ответы

▲ 2Принят

Условное агрегирование.

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.