In SQL i'd do something like this
Code:
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)
Not sure if it will work in access. Couldnt compile it either, but you get the gist :)
Edit: stupid forum is messing up the variable names... :(
Edit 2: Fixed some errors and attached code file