Primeiro, parece que seu aplicativo se beneficiaria de uma tabela de calendário. Uma tabela de calendário é uma lista de datas e informações sobre as datas.
Segundo, você pode fazer isso sem usar tabelas temporárias. Aqui está a abordagem:
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
Aqui está a ideia. As constantes de alias registram a data mais antiga em sua tabela. As datas do alias criam uma sequência de datas. A subconsulta interna calcula uma sequência de inteiros, usando rownum, e os adiciona à primeira data. Observe que isso pressupõe que você tenha, em média, pelo menos uma transação por data. Se não, você pode usar uma mesa maior.
A parte final é a junção que é usada para trazer de volta informações sobre as datas. Observe o uso de count(t.date) em vez de count(*). Isso conta o número de registros em sua tabela, que deve ser 0 para datas sem dados.