2017-07-13 4 views
0

Ich habe einen Code, der die gewünschte Ausgabe für ein "bewegendes" Universum ergibt, in dem es auf jeden Punkt schaut und mir die Informationen gibt. Ich möchte eine andere Abfrage haben, die die gleiche Ausgabe aber liefert für eine andere Auswahl ein "aktuelles" Universum.SQL - Auswahl innerhalb des Falls, wenn

Ein aktuelles Universum würde die Summen genauso machen wie jetzt, aber nur für Unternehmen, die die Kriterien zum spätesten Datum in der Datenbank erfüllen.

Momentan gibt der Code EBIT/Sales 2015 für Unternehmen mit Market_Cap zwischen 0 und 10000 2015 und so weiter, aber ich möchte lieber, dass es EBIT/Sales 2015 für Unternehmen mit Market_Cap zwischen 0 und 10000 (aktuell date_month in Market_Cap)

ich Microsoft SQL Server Management Studio bin mit

ich weitere Kriterien in der Summe einzufügen habe versucht (Fall, wenn ... dann) Syntax wie „Und c.company_id in (company_id auswählen von Market_cap wo Market_Cap zwischen 0 und 10000 und Datum = '2017-06-30)), aber ich bekomme Fehler:

Eine Aggregatfunktion für einen Ausdruck, der ein Aggregat oder eine Unterabfrage enthält, kann nicht ausgeführt werden.

-Code jetzt:

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; 

korrekte Ausgabe:

Antwort

1

Der einzige Code, den Sie hier enthalten war die Auswahl Code, nicht der Code, der tatsächlich filtert basierend auf Marktkapitalisierung. Würden Sie nicht wollen, diese Zeilen ändern:

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

zu vergleichen mm.Date_Month_Id um so etwas wie max(Date_Month_Id)?

+0

Danke, ich in der Summe (Fall, wenn ... Dann) zu verfangen bekam Syntax, die ich über die Prinzipien der SQL vergessen ... es funktioniert jetzt –

0

Correct Query (glaube ich):

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; 
Verwandte Themen