sql >> Database >  >> RDS >> Oracle

Hoe groeperen op maand inclusief alle maanden?

Oracle heeft een goede reeks datummanipulatiefuncties . De twee relevante voor dit probleem zijn

  • MONTHS_BETWEEN() die het aantal maanden tussen twee datums berekent
  • ADD_MONTHS() waarmee een datum wordt verhoogd met het opgegeven aantal maanden

We kunnen deze functies combineren om een ​​tabel te genereren van alle maanden die door de records van uw tabel worden overspannen. Vervolgens gebruiken we een outer join om records van USER_INFO voorwaardelijk aan die agenda toe te voegen. Als er geen records overeenkomen met count(id) nul zal zijn.

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. Waarom geeft deze lus niet elke vijf seconden een bijgewerkte objecttelling weer?

  2. Voeg meerdere rijen in een MySQL-database in vanuit een tabel

  3. MySQL Connector ODBC odbc.ini 'Option' vlagwaarden

  4. INSERT en transactieserialisatie in PostreSQL