sql >> Databáze >  >> RDS >> Oracle

Jak seskupit podle měsíce včetně všech měsíců?

Oracle má dobrá řada funkcí pro manipulaci s datem . Dva relevantní pro tento problém jsou

  • MONTHS_BETWEEN() který vypočítá počet měsíců mezi dvěma daty
  • ADD_MONTHS() která zvýší datum o daný počet měsíců

Tyto funkce můžeme zkombinovat, abychom vygenerovali tabulku všech měsíců, které zahrnují záznamy vaší tabulky. Potom použijeme vnější spojení k podmíněnému spojení záznamů z USER_INFO do tohoto kalendáře. Když žádné záznamy neodpovídají count(id) bude nula.

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. PostgreSQL:sériové vs identita

  2. Základy tabulkových výrazů, 3. část – Odvozené tabulky, úvahy o optimalizaci

  3. Porovnejte a nechte nová data vložit do tabulky podle měsíce

  4. žádná oprávnění pro tabulkový prostor 'USERS'