sql >> Databasteknik >  >> RDS >> Oracle

Hur grupperar man efter månad inklusive alla månader?

Oracle har ett bra utbud av datummanipuleringsfunktioner . De två relevanta för detta problem är

  • MONTHS_BETWEEN() som beräknar antalet månader mellan två datum
  • ADD_MONTHS() vilket ökar ett datum med det angivna antalet månader

Vi kan kombinera dessa funktioner för att generera en tabell över alla månader som spänner över din tabells poster. Sedan använder vi en yttre koppling för att villkorligt koppla poster från USER_INFO till den kalendern. När inga poster matchar count(id) kommer att vara noll.

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. Hur interagerar NOW() med transaktioner?

  2. Hur man installerar PostgreSQL 9.1 på OSX Lion

  3. Varför fungerar inte enkla If ELSE Statement i mySql

  4. MySQL lägg till 12 timmar till ett tidsfält