Tout d'abord, il semble que votre application bénéficierait d'un tableau de calendrier. Une table de calendrier est une liste de dates et d'informations sur les dates.
Deuxièmement, vous pouvez le faire sans utiliser de tables temporaires. Voici l'approche :
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
Voici l'idée. Les constantes d'alias enregistrent la date la plus ancienne dans votre table. Les dates alias créent alors une séquence de dates. La sous-requête interne calcule une séquence d'entiers, en utilisant rownum, puis les ajoute à la première date. Notez que cela suppose que vous avez en moyenne au moins une transaction par date. Sinon, vous pouvez utiliser une table plus grande.
La dernière partie est la jointure qui est utilisée pour ramener des informations sur les dates. Notez l'utilisation de count(t.date) au lieu de count(*). Cela compte le nombre d'enregistrements dans votre table, qui devrait être 0 pour les dates sans données.