Oracle heeft een goede reeks datummanipulatiefuncties . De twee relevante voor dit probleem zijn
MONTHS_BETWEEN()
die het aantal maanden tussen twee datums berekentADD_MONTHS()
waarmee een datum wordt verhoogd met het opgegeven aantal maanden
We kunnen deze functies combineren om een tabel te genereren van alle maanden die door de records van uw tabel worden overspannen. Vervolgens gebruiken we een outer join om records van USER_INFO voorwaardelijk aan die agenda toe te voegen. Als er geen records overeenkomen met count(id)
nul zal zijn.
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
/