Oracle har ett bra utbud av datummanipuleringsfunktioner . De två relevanta för detta problem är
MONTHS_BETWEEN()
som beräknar antalet månader mellan två datumADD_MONTHS()
vilket ökar ett datum med det angivna antalet månader
Vi kan kombinera dessa funktioner för att generera en tabell över alla månader som spänner över din tabells poster. Sedan använder vi en yttre koppling för att villkorligt koppla poster från USER_INFO till den kalendern. När inga poster matchar count(id)
kommer att vara noll.
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
/