Po pierwsze, wygląda na to, że Twoja aplikacja skorzystałaby z tabeli kalendarza. Tabela kalendarza to lista dat i informacje o datach.
Po drugie, możesz to zrobić bez używania tabel tymczasowych. Oto podejście:
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
Oto pomysł. Stałe aliasów rejestrują najwcześniejszą datę w tabeli. Alias daty tworzy następnie sekwencję dat. Podzapytanie wewnętrzne oblicza sekwencję liczb całkowitych przy użyciu rownum, a następnie dodaje je do pierwszej daty. Pamiętaj, że zakłada się, że masz średnio co najmniej jedną transakcję na dzień. Jeśli nie, możesz użyć większego stołu.
Ostatnią częścią jest sprzężenie, które służy do przywracania informacji o datach. Zwróć uwagę na użycie count(t.date) zamiast count(*). To zlicza liczbę rekordów w Twojej tabeli, która powinna wynosić 0 dla dat bez danych.