Oracle има добър набор от функции за манипулиране на дата . Двете уместни за този проблем са
MONTHS_BETWEEN()
който изчислява броя на месеците между две датиADD_MONTHS()
което увеличава дадена дата с дадения брой месеци
Можем да комбинираме тези функции, за да генерираме таблица от всички месеци, обхванати от записите на вашата таблица. След това използваме външно присъединяване, за да присъединим условно записи от USER_INFO към този календар. Когато нито един запис не съответства на count(id)
ще бъде нула.
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
/