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;