Oracle
 sql >> Database >  >> RDS >> Oracle

Come raggruppare per mese compresi tutti i mesi?

Oracle ha una buona gamma di funzioni di manipolazione della data . I due pertinenti per questo problema sono

  • MONTHS_BETWEEN() che calcola il numero di mesi tra due date
  • ADD_MONTHS() che incrementa una data del numero di mesi specificato

Possiamo combinare queste funzioni per generare una tabella di tutti i mesi occupati dai record della tua tabella. Quindi utilizziamo un join esterno per unire condizionalmente i record da USER_INFO a quel calendario. Quando nessun record corrisponde a count(id) sarà zero.

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
/