My production code based on local guru advises and @Ben technique:
-- generate sequence 1..N:
SELECT level FROM dual CONNECT BY level <= 4;
-- generates days:
select to_date('01-01-2012','DD-MM-YYYY') + level - 1
from dual
connect by level <= to_date('31-12-2012','DD-MM-YYYY') - to_date('01-01-2012','DD-MM-YYYY') + 1;
with dates as (
select (to_date('01-01-2012','DD-MM-YYYY') + level - 1) as daterange
from dual
connect by level <= to_date('31-12-2012','DD-MM-YYYY') - to_date('01-01-2012','DD-MM-YYYY') + 1
) select sum(tbl.cnt) as summ, trunc(dates.daterange, 'DDD')
from dates
left outer join DATA_TBL tbl
on trunc(tbl.inc_date, 'DDD') = trunc(dates.daterange, 'DDD')
group by trunc(dates.daterange, 'DDD')
order by trunc(dates.daterange, 'DDD');
-- generates months:
select ADD_MONTHS(to_date('01-01-2012','DD-MM-YYYY'), level - 1)
from dual
connect by level <= months_between(to_date('31-12-2012','DD-MM-YYYY'), to_date('01-01-2012','DD-MM-YYYY')) + 1;
with dates as (
select add_months(to_date('01-01-2012','DD-MM-YYYY'), level-1) as daterange
from dual
connect by level <= months_between(to_date('31-12-2012','DD-MM-YYYY'), to_date('01-01-2012','DD-MM-YYYY')) + 1
) select sum(tbl.cnt) as summ, trunc(dates.daterange, 'MM')
from dates
left outer join DATA_TBL tbl
on trunc(tbl.inc_date, 'MM') = trunc(dates.daterange, 'MM')
group by trunc(dates.daterange, 'MM')
order by trunc(dates.daterange, 'MM');
-- generates quarters:
select ADD_MONTHS(to_date('01-01-2012','DD-MM-YYYY'), (level-1)*3)
from dual
connect by level <= months_between(to_date('31-12-2012','DD-MM-YYYY'), to_date('01-01-2012','DD-MM-YYYY'))/3 + 1;
with dates as (
select add_months(to_date('01-01-2012','DD-MM-YYYY'), (level-1)*3) as daterange
from dual
connect by level <= months_between(to_date('31-12-2012','DD-MM-YYYY'), to_date('01-01-2012','DD-MM-YYYY'))/3 + 1
) select sum(tbl.cnt) as summ, trunc(dates.daterange, 'Q')
from dates
left outer join DATA_TBL tbl
on trunc(tbl.inc_date, 'Q') = trunc(dates.daterange, 'Q')
group by trunc(dates.daterange, 'Q')
order by trunc(dates.daterange, 'Q');
-- generates years:
select add_months(to_date('01-01-2007','DD-MM-YYYY'), (level-1)*12)
from dual
connect by level <= months_between(to_date('31-01-2012','DD-MM-YYYY'), to_date('01-01-2007','DD-MM-YYYY'))/12 + 1;
with dates as (
select add_months(to_date('01-01-2007','DD-MM-YYYY'), (level-1)*12) as daterange
from dual
connect by level <= months_between(to_date('31-01-2012','DD-MM-YYYY'), to_date('01-01-2007','DD-MM-YYYY'))/12 + 1
) select sum(tbl.cnt) as summ, trunc(dates.daterange, 'YYYY')
from dates
left outer join DATA_TBL tbl
on trunc(tbl.inc_date, 'YYYY') = trunc(dates.daterange, 'YYYY')
group by trunc(dates.daterange, 'YYYY')
order by trunc(dates.daterange, 'YYYY');
But connect by level is hack according to: