Zunächst klingt es so, als würde Ihre Anwendung von einer Kalendertabelle profitieren. Eine Kalendertabelle ist eine Liste von Daten und Informationen zu den Daten.
Zweitens können Sie dies tun, ohne temporäre Tabellen zu verwenden. Hier ist der Ansatz:
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 ist die Idee. Die Alias-Konstanten zeichnen das früheste Datum in Ihrer Tabelle auf. Die Alias-Daten erstellen dann eine Folge von Daten. Die innere Unterabfrage berechnet mithilfe von rownum eine Folge von ganzen Zahlen und fügt diese dann zum ersten Datum hinzu. Beachten Sie, dass davon ausgegangen wird, dass Sie im Durchschnitt mindestens eine Transaktion pro Datum haben. Wenn nicht, können Sie einen größeren Tisch verwenden.
Der letzte Teil ist der Join, der verwendet wird, um Informationen über die Daten zurückzugeben. Beachten Sie die Verwendung von count(t.date) anstelle von count(*). Dies zählt die Anzahl der Datensätze in Ihrer Tabelle, die für Daten ohne Daten 0 sein sollte.