with t as ( select 'A' store, to_date('2019-01-01','yyyy-mm-dd') contract_start, to_date('2019-03-31','yyyy-mm-dd') contract_end from dual union all select 'A' store, to_date('2019-04-01','yyyy-mm-dd') contract_start, to_date('2019-08-31','yyyy-mm-dd') contract_end from dual union all select 'B' store, to_date('2019-02-01','yyyy-mm-dd') contract_start, to_date('2019-05-31','yyyy-mm-dd') contract_end from dual union all select 'C' store, to_date('2019-03-01','yyyy-mm-dd') contract_start, to_date('2019-12-31','yyyy-mm-dd') contract_end from dual ) select b.dt, count(1) cnt from t a, (select to_date('2019-01-01','yyyy-mm-dd') + level - 1 dt from dual connect by level <=365) b where b.dt between a.contract_start(+) and contract_end(+) group by b.dt order by b.dt