Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để nhóm theo tháng bao gồm tất cả các tháng?

Oracle có một loạt các hàm thao tác ngày tháng tốt . Hai cái thích hợp cho vấn đề này là

  • MONTHS_BETWEEN() tính toán số tháng giữa hai ngày
  • ADD_MONTHS() tăng một ngày theo số tháng nhất định

Chúng tôi có thể kết hợp các hàm này để tạo một bảng gồm tất cả các tháng được kéo dài bởi các bản ghi trong bảng của bạn. Sau đó, chúng tôi sử dụng kết nối bên ngoài để kết hợp có điều kiện các bản ghi từ USER_INFO vào lịch đó. Khi không có bản ghi nào khớp với count(id) sẽ bằng không.

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. Hàm NLSSORT () trong Oracle

  2. Thay thế một phần của gói Oracle

  3. Oracle:Sử dụng CTE với điều khoản cập nhật

  4. Làm thế nào để kiểm tra cột là ảo trong Oracle?

  5. truy xuất nhóm nhiều cột theo liên tục ngày