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

Hvordan grupperes efter måned inklusive alle måneder?

Oracle har et godt udvalg af datomanipulationsfunktioner . De to relevante for dette problem er

  • MONTHS_BETWEEN() som beregner antallet af måneder mellem to datoer
  • ADD_MONTHS() hvilket øger en dato med det givne antal måneder

Vi kan kombinere disse funktioner for at generere en tabel over alle måneder spændt over af din tabels optegnelser. Så bruger vi en ydre joinforbindelse til betinget at forbinde poster fra USER_INFO til den kalender. Når ingen poster matcher count(id) vil være 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
/



  1. Oracle udtræk variabelt tal fra streng

  2. Tjen penge med ubrugte ting:En delingsøkonomi-datamodel

  3. MYSQL TINYBLOB vs LONGBLOB

  4. SQL Server Failover Cluster Installation -3