2017-04-27 6 views
0

Ich brauche eine Abfrage wie folgt auszuführen:Ersetzen Non-Exist-Gruppe durch die Ergebnisse

select SUM(TONS) as TONS 
from MyView 
where Date between '01.01.2017' and '12.31.2017' 
group by DATEPART(MONTH, Date) 
order by DATEPART(YEAR, Date) asc 

Das Problem ist, wenn es keine Daten im 3. Monat ist es 11 Zeilen insgesamt statt 12 zurück Wie kann ich fehlende Daten mit dem Wert 0 ersetzen?

+4

eine Kalender-Tabelle erstellen und links beitreten –

+0

@TimSchmelter, einmal würde ich beitreten ein Recht tun. (ZB "MyView rechts beitreten Kalender".) – jarlh

Antwort

1

Sie können das Ergebnis mit Monaten LEFT JOIN.

SELECT 
     C.M YourMonth, 
     COALESCE(Result.TONS, 0) AS TONS 
    FROM 
    (VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) C(M) LEFT JOIN 
    (
     SELECT 
      DATEPART(MONTH, T.Date) YourMonth, 
      SUM(T.TONS) AS TONS 
     FROM  
      MyView T 
     WHERE Date BETWEEN '01.01.2017' and '12.31.2017' 
     GROUP BY  
      DATEPART(MONTH, T.Date) 
    ) Result ON C.M = Result.YourMonth 
+1

vielen dank für die schnelle lösung – fuzunspm

3

Sie können einen Kalender-Tabelle erstellen und zu diesem beitreten, oder Sie können wie so eine Ad-hoc-Kalender verwenden:

declare @fromdate date = '20170101'; 
declare @thrudate date = '20171231'; 
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, dates as (
    select top (datediff(day, @fromdate,@thrudate)+1) 
     [Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate)) 
    from n as deka cross join n as hecto cross join n as kilo 
       cross join n as tenK cross join n as hundredK 
    order by [Date] 
) 
, cal as (
    select 
     [Date] 
    , [Month]=month([Date]) 
    , [Year] =year([Date]) 
    from dates 
) 

select 
    c.[Year] 
    , c.[Month] 
    , Tons = sum(v.Tons) 
from cal c 
    left join MyView v 
    on c.[Date] = v.[Date] 
where c.[Date] >= '20170101' 
    and c.[Date] <= '20171231' 
group by c.[Year], c.[Month] 
order by c.[Year], c.[Month] 

Kalender und Zahlen Tabellen verweisen:

+0

Vielen Dank für die Lösung. Ich konnte so nicht denken, was mir Stunden Arbeit ersparen könnte – fuzunspm

+0

@TimSchmelter Ich beschränkte mich auf nur eine der drei Seiten. Ich dachte, wenn jemand Interesse genug hätte, auf den Link zu klicken, könnten sie den Weg zur ersten und dritten Seite selbst finden. - Auch die zweite Seite zeigt die schlechte Leistung einer rekursiven Cte, die eine häufig gepostete Alternative zu der gestapelten Cte ist. Die rekursive CTE befindet sich nicht auf der dritten Seite, da sie so schlecht funktioniert hat, dass sie "nur dazu diente, Graphen zu verfälschen". – SqlZim

+0

@fuzunspm Glücklich zu helfen! – SqlZim