Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann man nach Monat gruppieren, einschließlich aller Monate?

Oracle hat eine gute Auswahl an Datumsmanipulationsfunktionen . Die zwei relevanten für dieses Problem sind

  • MONTHS_BETWEEN() die die Anzahl der Monate zwischen zwei Daten berechnet
  • ADD_MONTHS() die ein Datum um die angegebene Anzahl von Monaten erhöht

Wir können diese Funktionen kombinieren, um eine Tabelle aller Monate zu erstellen, die von den Datensätzen Ihrer Tabelle abgedeckt werden. Dann verwenden wir einen äußeren Join, um Datensätze von USER_INFO bedingt mit diesem Kalender zu verknüpfen. Wenn keine Datensätze mit count(id) übereinstimmen wird Null sein.

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
/