2017-07-13 5 views
0

J'ai un code qui donne la sortie désirée pour un univers "mobile" dans lequel il regarde chaque période et me donne l'information. Je voudrais avoir une autre requête qui donne la même sortie mais pour une sélection différente, un univers "actuel".SQL - Sélection dans le cas où

Un univers actuel ferait les sommes comme il le fait actuellement, mais uniquement pour les entreprises qui répondent aux critères à la dernière date dans la base de données.

À l'heure actuelle, le code produit EBIT/Sales 2015 pour les entreprises ayant Market_Cap entre 0 et 10000 2015 et ainsi de suite, mais je souhaite plutôt qu'il génère EBIT/Sales 2015 pour les entreprises ayant Market_Cap entre 0 et 10000 date_month à Market_Cap)

J'utilise Microsoft SQL Server Management studio

J'ai essayé d'insérer un autre critère dans la somme (cas où ... alors) syntaxe comme « Et dans c.company_id (Sélectionnez company_id de Market_cap où Market_Cap entre 0 et 10000 et Date = '2017-06-30)) mais j'obtiens l'erreur:

Impossible d'exécuter une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête.

par code:

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; 

sortie correcte:

Répondre

1

Le code que vous avez inclus ici était le code de sélection, pas le code qui filtre réellement basé sur la capitalisation boursière. Ne vous voulez changer ces lignes:

inner join Market_Cap as mm on mm.Date_Month_Id = n.Date_Month_Id 
         and mm.Company_Id = n.Company_Id 

pour comparer mm.Date_Month_Id à quelque chose comme max(Date_Month_Id)?

+0

Merci, je suis arrivé à pris dans la Somme (cas où ... Puis) syntaxe que j'oublié les principes de SQL ... cela fonctionne à présent –

0

correcte requête (je pense):

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;