Oracleには
-
MONTHS_BETWEEN()
2つの日付の間の月数を計算します -
ADD_MONTHS()
指定された月数だけ日付をインクリメントします
これらの関数を組み合わせて、テーブルのレコードにまたがるすべての月のテーブルを生成できます。次に、外部結合を使用して、USER_INFOからそのカレンダーにレコードを条件付きで結合します。 count(id)
に一致するレコードがない場合 ゼロになります。
with cte as (
select max(trunc(created, 'MM')) as max_dt
, min(trunc(created, 'MM')) as min_dt
from user_info
)
, cal as (
select add_months(min_dt, (level-1)) as mth
from cte
connect by level <= months_between(max_dt, min_dt) + 1
)
select to_char(cal.mth, 'YYYY-MM') as operation
, count(id)
from cal
left outer join user_info
on trunc(user_info.created, 'mm') = cal.mth
group by rollup (cal.mth)
order by 1
/