特定の年が必要だとしましょう。
DECLARE @year INT;
SET @year = 2012;
DECLARE @start SMALLDATETIME;
SET @start = DATEADD(YEAR, @year-1900, 0);
;WITH y AS (SELECT TOP (12) rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
FROM sys.all_objects ORDER BY [object_id])
SELECT DATEADD(MONTH, y.rn, @start), COUNT(t.issueDate)
FROM y
LEFT OUTER JOIN dbo.MyTable AS t
ON t.issueDate >= DATEADD(MONTH, y.rn, @start)
AND t.issueDate < DATEADD(MONTH, y.rn + 1, @start)
GROUP BY DATEADD(MONTH, y.rn, @start);
特定の年でない場合は、最初の月の1日と先月の1日を指定する(または4つの整数を渡して手動で日付を作成する)限り、任意の日付範囲をカバーするために少し異なる方法で行うことができます。 )::
DECLARE @startdate SMALLDATETIME, @enddate SMALLDATETIME;
SELECT @startdate = '20111201', @enddate = '20120201';
;WITH y AS (SELECT TOP (DATEDIFF(MONTH, @startdate, @enddate)+1)
rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
FROM sys.all_objects ORDER BY [object_id]
)
SELECT DATEADD(MONTH, y.rn, @startdate), COUNT(t.issueDate)
FROM y
LEFT OUTER JOIN dbo.MyTable AS t
ON t.issueDate >= DATEADD(MONTH, y.rn, @startdate)
AND t.issueDate < DATEADD(MONTH, y.rn + 1, @startdate)
GROUP BY DATEADD(MONTH, y.rn, @startdate);