SQL - объединение нескольких операторов Select

Я пытаюсь объединить четыре различных оператора выбора в один, который дает мне желаемый результат.

Два утверждения можно увидеть ниже (они и остальные идентичны, за исключением Y.Date_Year)

select sum(N.EBIT)/Sum(S.Sales), M.Date_Month from EBIT as N 
inner join Date_Year as Y on Y.Date_Year_Id = N.Date_Year_Id
inner join Sales As S on S.Company_Id = N.Company_Id
inner join Date_Month As M on M.Date_Month_Id=N.Date_Month_Id
where Y.Date_Year = 2014 and (N.Date_Month_Id = S.Date_Month_Id And N.Date_Year_Id = S.Date_Year_Id) and N.EBIT <> 0 and S.Sales <> 0
group by M.Date_Month

select sum(N.EBIT)/Sum(S.Sales), M.Date_Month from EBIT as N
inner join Date_Year as Y on Y.Date_Year_Id = N.Date_Year_Id
inner join Sales As S on S.Company_Id = N.Company_Id
inner join Date_Month As M on M.Date_Month_Id=N.Date_Month_Id
where Y.Date_Year = 2015 and (N.Date_Month_Id = S.Date_Month_Id And N.Date_Year_Id = S.Date_Year_Id) and N.EBIT <> 0 and S.Sales <> 0
group by M.Date_Month

Они дают мне разные взгляды с колонкой Date_Month и колонкой EBIT/Sales. На данный момент мне нужно перейти в Excel, вставить в него различные значения и расположить их так, чтобы они переходили от начальной даты (первый месяц в столбце Date_Month) к конечной дате (последний месяц в столбце Date_Month), а затем перемещали различные EBIT/Sales значения в положении.

Первое утверждение содержит данные за период с 2012-01-31 по 2015-11-30, а второе заявление содержит данные с 2012-01-31 по 2016-11-30. Я хотел бы иметь таблицу, которая выглядит примерно так:

Date_Month       EBIT/Sales 2014         EBIT/Sales 2015      
2012-01-31       0.09                     0.10
....             .....                    .....
2016-11-30       'Null'                   0.098

Следовательно, они находятся в одном и том же списке, но там, где один из столбцов не имеет значения, он выдаст значение Null.

Спасибо за любую помощь.

Ps это оценки в данных, поэтому не путайте со значениями за 2014 год, существующими в 2012-01-31 и т. Д.

1 ответ

Решение

Вы ищете условное агрегирование или сводный запрос. Я более привык к первому, поэтому вот оно:

select 
  m.date_month,
  sum(case when y.date_year = 2014 then n.ebit end) / 
   sum(case when y.date_year = 2014 then s.sales end) as "EBIT/Sales 2014",
  sum(case when y.date_year = 2015 then n.ebit end) / 
   sum(case when y.date_year = 2015 then s.sales end) as "EBIT/Sales 2015",
  sum(case when y.date_year = 2016 then n.ebit end) / 
   sum(case when y.date_year = 2016 then s.sales end) as "EBIT/Sales 2016",
  sum(case when y.date_year = 2017 then n.ebit end) / 
   sum(case when y.date_year = 2017 then s.sales end) as "EBIT/Sales 2017"
from ebit as n 
inner join sales as s on  s.company_id = n.company_id
                      and s.date_month_id = n.date_month_id 
                      and s.date_year_id = n.date_year_id
inner join date_year as y on y.date_year_id = n.date_year_id
inner join date_month as m on m.date_month_id = n.date_month_id
where y.date_year in (2014, 2015, 2016, 2017)
and n.ebit <> 0 
and s.sales <> 0
group by m.date_month;
Другие вопросы по тегам