Ten eerste klinkt het alsof uw toepassing baat zou hebben bij een kalendertabel. Een kalendertabel is een lijst met data en informatie over de data.
Ten tweede kunt u dit doen zonder tijdelijke tabellen te gebruiken. Hier is de aanpak:
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
Hier is het idee. De aliasconstanten registreren de vroegste datum in uw tabel. De alias datums creëert vervolgens een reeks datums. De binnenste subquery berekent een reeks gehele getallen met behulp van rownum en voegt deze vervolgens toe aan de eerste datum. Let op:hierbij wordt ervan uitgegaan dat u gemiddeld minimaal één transactie per datum heeft. Zo niet, dan kun je een grotere tafel gebruiken.
Het laatste deel is de join die wordt gebruikt om informatie over de datums terug te brengen. Let op het gebruik van count(t.date) in plaats van count(*). Dit telt het aantal records in uw tabel, dat 0 zou moeten zijn voor datums zonder gegevens.