Oracle má dobrá řada funkcí pro manipulaci s datem . Dva relevantní pro tento problém jsou
MONTHS_BETWEEN()
který vypočítá počet měsíců mezi dvěma datyADD_MONTHS()
která zvýší datum o daný počet měsíců
Tyto funkce můžeme zkombinovat, abychom vygenerovali tabulku všech měsíců, které zahrnují záznamy vaší tabulky. Potom použijeme vnější spojení k podmíněnému spojení záznamů z USER_INFO do tohoto kalendáře. Když žádné záznamy neodpovídají count(id)
bude nula.
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
/