Oracle a un bon éventail de fonctions de manipulation de date . Les deux plus pertinentes pour ce problème sont
MONTHS_BETWEEN()
qui calcule le nombre de mois entre deux datesADD_MONTHS()
qui incrémente une date du nombre de mois donné
Nous pouvons combiner ces fonctions pour générer un tableau de tous les mois couverts par les enregistrements de votre tableau. Ensuite, nous utilisons une jointure externe pour joindre conditionnellement les enregistrements de USER_INFO à ce calendrier. Lorsqu'aucun enregistrement ne correspond à count(id)
sera 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
/