SQL - выбор в случае, когда
У меня есть код, который дает желаемый вывод для "движущейся" вселенной, в которой он просматривает каждый период и дает мне информацию. Я хотел бы иметь другой запрос, который дает тот же вывод, но для другого выбора, "текущий" вселенная.
Текущая вселенная получит суммы точно так же, как они делают сейчас, но только для компаний, которые соответствуют критериям на самую последнюю дату в базе данных.
Сейчас код дает EBIT/Sales 2015 для компаний, у которых Market_Cap находится в диапазоне от 0 до 10000 2015 года и т. Д., Но я бы предпочел, чтобы он приносил EBIT/Sales 2015 для компаний, у которых Market_Cap находится в диапазоне от 0 до 10000 в настоящее время (последняя дата_месяца в Market_Cap)
Я использую Microsoft SQL Server Management Studio
Я попытался вставить другой критерий в синтаксис суммы (случай, когда... затем) как "И c.company_id в (выберите company_id из Market_cap, где Market_Cap между 0 и 10000 и Date = '2017-06-30)), но Я получаю ошибку:
Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос.
Код сейчас:
select m.date_month
,sum(case when y.date_year = 2015 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 then n.EBIT end) / sum(case when y.date_year = 2015 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 then s.Sales end) as 'EBIT/Sales 2015'
,sum(case when y.date_year = 2016 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 then n.EBIT end) / sum(case when y.date_year = 2016 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 then s.Sales end) as 'EBIT/Sales 2016'
,sum(case when y.date_year = 2017 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 then n.EBIT end) / sum(case when y.date_year = 2017 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 AND mm.Market_Cap between 0 and 10000 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
inner join Market_Cap as mm on mm.Date_Month_Id = n.Date_Month_Id
and mm.Company_Id = n.Company_Id
inner join Company as c on c.Company_Id = n.Company_Id
where y.date_year between 2015 and 2017
and n.EBIT<> 0
and s.Sales<> 0
group by m.date_month;
Правильный вывод:
2 ответа
Единственный код, который вы включили здесь, был кодом выбора, а не кодом, который фактически фильтрует на основе рыночной капитализации. Разве вы не хотите изменить эти строки:
inner join Market_Cap as mm on mm.Date_Month_Id = n.Date_Month_Id
and mm.Company_Id = n.Company_Id
сравнивать mm.Date_Month_Id
что-то вроде max(Date_Month_Id)
?
Правильный запрос (я думаю):
select m.date_month
,sum(case when y.date_year = 2015 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 then n.EBIT end) / sum(case when y.date_year = 2015 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 then s.Sales end) as 'EBIT/Sales 2015'
,sum(case when y.date_year = 2016 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 then n.EBIT end) / sum(case when y.date_year = 2016 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 then s.Sales end) as 'EBIT/Sales 2016'
,sum(case when y.date_year = 2017 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 then n.EBIT end) / sum(case when y.date_year = 2017 AND c.Country_Id in (4,5,6) AND c.factSet_Level1_Id between 1 and 100 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
inner join Market_Cap as mm on mm.Date_Month_Id = n.Date_Month_Id
and mm.Company_Id = n.Company_Id
inner join Company as c on c.Company_Id = n.Company_Id
where y.date_year between 2015 and 2017 and c.Company_Id in (Select Company_Id from Market_Cap Where Market_Cap between 0 and 1000)
and n.EBIT<> 0
and s.Sales<> 0
group by m.date_month
order by m.Date_Month asc;