2016-10-19 11 views
0

Я выбираю год, месяц и чистые продажи из таблицы счетов. Проблема в том, что если в конкретный месяц нет данных, в этом месяце не будет строк. Вы можете мне помочь? Чистые продажи должны быть равны нулю, если данных нет.SELECT SQL данные на основе даты, заполнения месяца

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) 

Заранее спасибо.

+0

@a_horse_with_no_name MS SQL – lingo

ответ

2

Вам нужен calendar стол и 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) 

У меня есть генерирует даты на лету, используя Recursive CTE, но я всегда предлагаю создать таблицу календаря физически и использовать его в таких запросах

+2

Да, это хороший подход. Поскольку многим компаниям нужны отчеты, основанные на календарных месяцах, я думаю, что полезно иметь таблицу только месяцев (дату начала, дату окончания, количество дней, календарный год, номер месяца). –

+0

Спасибо, отделенная таблица - хорошее решение. – lingo