Oracle har et godt udvalg af datomanipulationsfunktioner . De to relevante for dette problem er
MONTHS_BETWEEN()
som beregner antallet af måneder mellem to datoerADD_MONTHS()
hvilket øger en dato med det givne antal måneder
Vi kan kombinere disse funktioner for at generere en tabel over alle måneder spændt over af din tabels optegnelser. Så bruger vi en ydre joinforbindelse til betinget at forbinde poster fra USER_INFO til den kalender. Når ingen poster matcher count(id)
vil være nul.
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
/