2016-10-19 10 views
0

Ich wähle Jahr, Monat und Nettoumsatz aus Rechnung Tabelle. Das Problem ist, dass, wenn es keine Daten für einen bestimmten Monat gibt, für diesen Monat keine Zeilen vorhanden sind. Kannst du mir helfen? Der Nettoumsatz sollte Null sein, wenn keine Daten vorhanden sind.SELECT SQL-Daten basierend auf Datum, Füllmonat

SELECT 
    DATEPART(year, date) as 'year', 
    DATEPART(month, date) as 'month', 
    SUM(netsales) as netsales 
FROM invoice 
WHERE 
    date >= '2015-01-01' 
    AND date <= '2016-12-31' 
GROUP BY 
    DATEPART(year, date), 
    DATEPART(month, date) 

Vielen Dank im Voraus.

+0

@a_horse_with_no_name verwenden MS SQL – lingo

Antwort

2

Sie benötigen einen calendar Tisch und left join

;with calendar as 
(
select cast('2015-01-01' as date) as dates -- start date 
union all 
select dateadd(mm,1,dates) from cte where dates < '2016-12-31' -- end date 
) 

SELECT 
    DATEPART(year, c.dates) as 'year', 
    DATEPART(month, c.dates) as 'month', 
    SUM(netsales) as netsales 
FROM calendar C left join invoice i on c.dates = cast(i.[date] as date) 
GROUP BY 
    DATEPART(year, date), 
    DATEPART(month, date) 

Ich habe Tage, on the fly erzeugt Recursive CTE, aber ich schlägt immer einen Kalender Tabelle physisch zu erstellen und sie in solche Abfragen

+2

Ja, das ist ein guter Ansatz. Da viele Unternehmen Berichte basierend auf Kalendermonaten benötigen, halte ich es auch für sinnvoll, eine Tabelle mit nur wenigen Monaten (Startdatum, Enddatum, Anzahl der Tage, Kalenderjahr, Monatsnummer) zu erstellen. –

+0

Danke, der getrennte Tisch ist eine gute Lösung. – lingo

Verwandte Themen