A Oracle tem uma boa variedade de funções de manipulação de data . Os dois pertinentes para este problema são
MONTHS_BETWEEN()
que calcula o número de meses entre duas datasADD_MONTHS()
que incrementa uma data por um determinado número de meses
Podemos combinar essas funções para gerar uma tabela de todos os meses abrangidos pelos registros da sua tabela. Em seguida, usamos uma junção externa para unir condicionalmente registros de USER_INFO a esse calendário. Quando nenhum registro corresponde a
count(id)
será nulo. 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
/