Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment regrouper par mois incluant tous les mois ?

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 dates
  • ADD_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
/