Oracle ha una buona gamma di funzioni di manipolazione della data . I due pertinenti per questo problema sono
MONTHS_BETWEEN()
che calcola il numero di mesi tra due dateADD_MONTHS()
che incrementa una data del numero di mesi specificato
Possiamo combinare queste funzioni per generare una tabella di tutti i mesi occupati dai record della tua tabella. Quindi utilizziamo un join esterno per unire condizionalmente i record da USER_INFO a quel calendario. Quando nessun record corrisponde a count(id)
sarà zero.
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
/