Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como agrupar por mês incluindo todos os meses?


A Oracle tem uma boa variedade de funções de manipulação de data . Os dois pertinentes para este problema são
  • MONTHS_BETWEEN() que calcula o número de meses entre duas datas
  • ADD_MONTHS() que incrementa uma data por um determinado número de meses

Podemos combinar essas funções para gerar uma tabela de todos os meses abrangidos pelos registros da sua tabela. Em seguida, usamos uma junção externa para unir condicionalmente registros de USER_INFO a esse calendário. Quando nenhum registro corresponde a count(id) será nulo.
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
/