Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да групирате по месеци, включително всички месеци?

Oracle има добър набор от функции за манипулиране на дата . Двете уместни за този проблем са

  • MONTHS_BETWEEN() който изчислява броя на месеците между две дати
  • ADD_MONTHS() което увеличава дадена дата с дадения брой месеци

Можем да комбинираме тези функции, за да генерираме таблица от всички месеци, обхванати от записите на вашата таблица. След това използваме външно присъединяване, за да присъединим условно записи от USER_INFO към този календар. Когато нито един запис не съответства на count(id) ще бъде нула.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на тригер за последователност на Oracle

  2. Как да поставя стойности по подразбиране за всяка колона в таблицата?

  3. SQL синтаксис за заявка за актуализиране със свързване от преди

  4. Oracle SQL Developer - Как да възстановите изпусната таблица

  5. Проблем:Получаване на различни резултати от SUM заявки