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;
Другие вопросы по тегам