sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo agrupar por mes incluyendo todos los meses?

Oracle tiene una buena variedad de funciones de manipulación de fechas . Los dos pertinentes para este problema son

  • MONTHS_BETWEEN() que calcula el número de meses entre dos fechas
  • ADD_MONTHS() que incrementa una fecha por el número dado de meses

Podemos combinar estas funciones para generar una tabla de todos los meses que abarcan los registros de su tabla. Luego usamos una unión externa para unir condicionalmente los registros de USER_INFO a ese calendario. Cuando ningún registro coincide con count(id) será cero.

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
/