Đầu tiên, có vẻ như ứng dụng của bạn sẽ được hưởng lợi từ một bảng lịch. Bảng lịch là danh sách các ngày và thông tin về các ngày.
Thứ hai, bạn có thể làm điều này mà không cần sử dụng các bảng tạm thời. Đây là cách tiếp cận:
with constants as (select min(thedate>) as firstdate from <table>)
dates as (select( <firstdate> + rownum - 1) as thedate
from (select rownum
from <table> cross join constants
where rownum < sysdate - <firstdate> + 1
) seq
)
select dates.thedate, count(t.date)
from dates left outer join
<table> t
on t.date = dates.thedate
group by dates.thedate
Đây là ý tưởng. Hằng số bí danh ghi lại ngày sớm nhất trong bảng của bạn. Sau đó, bí danh ngày tháng tạo ra một chuỗi ngày tháng. Truy vấn con bên trong tính toán một chuỗi các số nguyên, sử dụng rownum, sau đó thêm chúng vào ngày đầu tiên. Lưu ý rằng điều này giả định rằng trung bình bạn có ít nhất một giao dịch mỗi ngày. Nếu không, bạn có thể sử dụng một bảng lớn hơn.
Phần cuối cùng là phép nối được sử dụng để đưa lại thông tin về ngày tháng. Lưu ý việc sử dụng count (t.date) thay vì count (*). Điều này đếm số lượng bản ghi trong bảng của bạn, sẽ là 0 cho các ngày không có dữ liệu.