DECLARE @YearMin INT DECLARE @YearMax INT DECLARE @MonthMin INT DECLARE @MonthMax INT DECLARE @CurrentYear INT DECLARE @CurrentMonth INT DECLATE @Months TABLE(DateYear INT NOT NULL, DateMonth INT NOT NULL) SELECT @YearMin = ISNULL(MIN(YEAR(tblDetentions.DateSetFor)), YEAR(GETDATE())) FROM tblDetentions SELECT @YearMax = ISNULL(MAX(YEAR(tblDetentions.DateSetFor)), YEAR(GETDATE())) FROM tblDetentions SELECT @MonthMin = ISNULL(MIN(MONTH(tblDetentions.DateSetFor)), MONTH(GETDATE())) FROM tblDetentions WHERE YEAR(tblDetentions.DateSetFor) = @YearMin SELECT @MonthMax = ISNULL(MAX(MONTH(tblDetentions.DateSetFor)), MONTH(GETDATE())) FROM tblDetentions WHERE YEAR(tblDetentions.DateSetFor) = @YearMax SELECT @CurrentYear = @YearMin SELECT @CurrentMonth = @MonthMin WHILE @CurrentYear <= @YearMax BEGIN WHILE (@CurrentYear < @YearMax AND @CurrentMonth <= 12) OR (@CurrentYear = @YearMax AND @CurrentMonth <= @MonthMax) BEGIN INSERT INTO @Months (DateYear, DateMonth) VALUES (@CurrentYear, @CurrentMonth) SELECT @CurrentMonth = @CurrentMonth + 1 END SELECT @CurrentYear = @CurrentYear + 1 END SELECT MONTH(tblMonths.DateMonth) AS MonthGiven, YEAR(tblMonths.DateYear) AS YearGiven, ISNULL(COUNT(tblDetentions.DateSetFor), 0) AS TotalDetentionsCount FROM @Months tblMonths INNER JOIN tblDetentions ON MONTH(tblDetentions.DateSetFor) = tblMonths.DateMonth AND YEAR(tblDetentions.DateSetFor) = tblMonths.DateYear GROUP BY YEAR(tblMonths.DateYear), MONTH(tblMonths.DateMonth) ORDER BY YEAR(tblMonths.DateYear), MONTH(tblMonths.DateMonth)