connect by
階層クエリの構文を使用して月番号を含むダミーテーブルを作成し、データに左結合することができます。
with months as (
select to_char(level, 'FM00') as month
from dual
connect by level <= 12
)
select m.month,
count(mdt.rowid) as counter
from months m
left join mydatatable mdt
on mdt.date_entered >= to_date('01/' || m.month || '/2011', 'DD/MM/YYYY')
and mdt.date_entered <
add_months(to_date('01/' || m.month || '/2011', 'DD/MM/YYYY'), 1)
group by m.month
order by m.month;
いくつかの構成されたデータを使用して:
create table mydatatable (date_entered date, dummy number);
insert into mydatatable values (date '2011-06-02', 0);
insert into mydatatable values (date '2011-07-01', 0);
insert into mydatatable values (date '2011-10-01', 0);
insert into mydatatable values (date '2011-10-31', 0);
insert into mydatatable values (date '2011-11-01', 0);
... これは与える:
MONTH COUNTER
----- -------
01 0
02 0
03 0
04 0
05 0
06 1
07 1
08 0
09 0
10 2
11 1
12 0
または、SQL Fiddleは、最近やるべきことのようです...
to_char(date_entered, 'yyyy') = '2011'
テーブルのすべての行に関数を適用しているため、一般的には避ける方がよいでしょう。to_char()
その列にインデックスがある場合、そのインデックスは使用されません。代わりに、のような列のデータ型に一致するようにフィルターを変換してみてくださいdate_entered > date '2011-01-01' and date_entered < date '2012-01-01'
。この場合、とにかく結合条件で処理できます。2011年に毎月を日付範囲に変換し、その月の範囲内で一致するレコードのみを検索します。