まず、あなたのアプリケーションはカレンダー テーブルから恩恵を受けるように思えます。カレンダー テーブルは、日付と日付に関する情報のリストです。
次に、一時テーブルを使用せずにこれを行うことができます。アプローチは次のとおりです。
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
これがアイデアです。エイリアス定数は、テーブルの最も早い日付を記録します。エイリアスの日付は、一連の日付を作成します。内側のサブクエリは、rownum を使用して一連の整数を計算し、これらを最初の日付に追加します。これは、平均して 1 日あたり少なくとも 1 回の取引があることを前提としています。そうでない場合は、より大きなテーブルを使用できます。
最後の部分は、日付に関する情報を戻すために使用される結合です。 count(*) の代わりに count(t.date) を使用していることに注意してください。これにより、テーブル内のレコード数がカウントされます。データのない日付の場合は 0 になります。