您可以使用类似的方法为您的查询生成月份序列:
declare @StartDate date = '20170101'
,@NumberOfYears int = 1;
;with Months as (
select top (12*@NumberOfYears)
[Month] = dateadd(Month, row_number() over (order by number) -1, @StartDate)
, NextMonth = dateadd(Month, row_number() over (order by number), @StartDate)
from master.dbo.spt_values
)
select
year(m.Month) [Year],
Month(m.Month) [Month],
datename(Month,m.Month) [Month Name],
count(h.*) [Total Documents]
from Months as m
left join Document_Count_History AS h
on h.metaInsert >= m.Month
and h.metaInsert < m.NextMonth
--where h.metaInsert >= '20170101'
group by m.Month
order by m.Month
虽然您可能需要考虑添加日历表或日期维度。
日历和数字表参考:
示例月份表:
create table dbo.Months(
MonthStart date not null primary key
, NextMonthStart date not null
, [Year] smallint not null
, [Month] tinyint not null
, [MonthName] varchar(16) not null
);
declare @StartDate date = '20100101'
,@NumberOfYears int = 30;
insert dbo.Months(MonthStart,NextMonthStart,[Year],[Month])
select top (12*@NumberOfYears)
[MonthStart] = dateadd(month, row_number() over (order by number) -1, @StartDate)
, NextMonthStart = dateadd(month, row_number() over (order by number), @StartDate)
, [year] = year(dateadd(month, row_number() over (order by number) -1, @StartDate))
, [Month] = Month(dateadd(month, row_number() over (order by number) -1, @StartDate))
, MonthName = datename(Month,dateadd(month, row_number() over (order by number) -1, @StartDate))
from master.dbo.spt_values;
您的查询将简化为:
select
m.[Year],
m.[Month],
m.[MonthName],
count(h.*) [Total Documents]
from Months as m
left join Document_Count_History AS h
on h.metaInsert >= m.MonthStart
and h.metaInsert < m.NextMonthStart
where m.Year = 2017
group by m.Month, m.Year, m.MonthName
order by m.MonthStart