Innanzitutto, sembra che la tua applicazione possa trarre vantaggio da una tabella del calendario. Una tabella del calendario è un elenco di date e informazioni sulle date.
In secondo luogo, puoi farlo senza utilizzare tabelle temporanee. Ecco l'approccio:
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
Ecco l'idea. Le costanti alias registrano la prima data nella tabella. L'alias date crea quindi una sequenza di date. La sottoquery interna calcola una sequenza di numeri interi, utilizzando rownum, quindi li aggiunge alla prima data. Tieni presente che questo presuppone che tu abbia in media almeno una transazione per data. In caso contrario, puoi utilizzare un tavolo più grande.
La parte finale è il join utilizzato per riportare informazioni sulle date. Nota l'uso di count(t.date) invece di count(*). Questo conta il numero di record nella tua tabella, che dovrebbe essere 0 per le date senza dati.