Oracle memiliki serangkaian fungsi manipulasi tanggal yang baik . Dua yang relevan untuk masalah ini adalah
MONTHS_BETWEEN()
yang menghitung jumlah bulan antara dua tanggalADD_MONTHS()
yang menambah tanggal dengan jumlah bulan tertentu
Kami dapat menggabungkan fungsi-fungsi ini untuk menghasilkan tabel dari semua bulan yang direntang oleh catatan tabel Anda. Kemudian kami menggunakan gabungan luar untuk menggabungkan catatan dari USER_INFO ke kalender itu secara kondisional. Ketika tidak ada catatan yang cocok dengan count(id)
akan menjadi nol.
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
/