Problem solved.
I used a temporary table to identify the month groups I was interested in then an inner join with a between directive to identify the correct data.
I.E.
DECLARE @Calendar TABLE(theMonth DATETIME);
INSERT INTO @Calendar ( theMonth )
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
INSERT INTO @Calendar ( theMonth )
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, -1, GETDATE())), 0)
INSERT INTO @Calendar ( theMonth )
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, -2, GETDATE())), 0)
INSERT INTO @Calendar ( theMonth )
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, -3, GETDATE())), 0)
SELECT calendar.theMonth,
COUNT(1) AS total
FROM SourceTable AS t
INNER JOIN @Calendar AS calendar
ON (calendar.theMonth
BETWEEN DATEADD(MONTH,DATEDIFF(MONTH,0, t.OpenOn),0)
AND CASE
WHEN t.ClosedOn IS NULL THEN GETDATE()
ELSE t.ClosedOn
END)
GROUP BY calendar.theMonth,
ORDER BY calendar.theMonth DESC