次のように月のリストを生成できます。
SELECT add_months (trunc (to_date('01/01/2012','MM/DD/YYYY'), 'MM'), 1*LEVEL -1) FirstDay
FROM Dual
CONNECT BY LEVEL <= MONTHS_BETWEEN(to_date('12/31/2012','MM/DD/YYYY'), to_date('01/01/2012','MM/DD/YYYY')) + 1
ORDER BY FirstDay
これにより、次の出力が得られます。
FIRSTDAY
--------
January, 01 2012 00:00:00+0000
February, 01 2012 00:00:00+0000
March, 01 2012 00:00:00+0000
April, 01 2012 00:00:00+0000
May, 01 2012 00:00:00+0000
June, 01 2012 00:00:00+0000
July, 01 2012 00:00:00+0000
August, 01 2012 00:00:00+0000
September, 01 2012 00:00:00+0000
October, 01 2012 00:00:00+0000
November, 01 2012 00:00:00+0000
December, 01 2012 00:00:00+0000
次に、次のように、そのクエリをインラインビューとして含めることができます。
SELECT months.FirstDay,
(SELECT count(subscribers)
FROM subscriberlist sub
WHERE months.FirstDay BETWEEN sub.firstDayOfSubscription AND sub.lastDayOfSubscription
) AS activeSubscribers
FROM (SELECT add_months(trunc (to_date('01/01/2012','MM/DD/YYYY'), 'MM'), 1*LEVEL -1) FirstDay
FROM Dual
CONNECT BY LEVEL <= MONTHS_BETWEEN(to_date('12/31/2012','MM/DD/YYYY'), to_date('01/01/2012','MM/DD/YYYY')) + 1
ORDER BY FirstDay) Months
おそらくこれを@startDateパラメーターと@endDateパラメーターを受け入れるsprocでラップして、関心のある日付範囲を定義しますが、構文に従って、日付範囲を文字列で定義しました。
私はこのSqlFiddleを使用してこれで遊んでいました