Oracle tiene una buena variedad de funciones de manipulación de fechas . Los dos pertinentes para este problema son
MONTHS_BETWEEN()
que calcula el número de meses entre dos fechasADD_MONTHS()
que incrementa una fecha por el número dado de meses
Podemos combinar estas funciones para generar una tabla de todos los meses que abarcan los registros de su tabla. Luego usamos una unión externa para unir condicionalmente los registros de USER_INFO a ese calendario. Cuando ningún registro coincide con count(id)
será cero.
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
/