В связи с появлением проблемы 6-го дня (см. предыдущий пост) вытащить период (данные за определенный промежуток вермени с шагом например в день), у которого есть дата начала и дата конца, средствами php становится невозможно, поэтому пришлось выдумывать хитрую, но 100% рабочую схему в Oracle.
Начальная ситуация: статистика, есть таблица с периодами (periods) и таблица со статистическими данными, которые расположены по датам (несколько записей за день), но не всегда за все даты есть данные или требуется отобразить период, который еще не закончился, но показать нужно от начала до конца с нулями за даты, которые еще не прошли.
select d.dt, sum(<здесь все что нужно выбрать из таблицы статистики>)
from
(
SELECT (TRUNC(( select databegin from periods where period_id= '<идентификатор периода>' ), 'DD') + ROWNUM -1) as dt
FROM all_objects WHERE ROWNUM <= ( select trunc(dataend) - trunc(databegin) from periods where period_id= '<идентификатор периода>' ) + 1
) d
left join
( <таблица или несколько статистики> ) e
on d.dt=trunc(e.date)
group by d.dt
Теперь подробно по строчкам.
Таким образом создаеся нужный диапазон дат (дней) и к нему привязывается информация из статистики, заполненные с любым шагом.
В случае, если не требуется определять даты начала и клнца периода, а все заранее известно, то сформировать таблицу дат с нужным количеством рядов еще проще, можно использовать CUBE или еще что-то в зависимости от длинны диапазона, как это сделать ответит гугль.
Не знаю насколько частро встречается подобная ситуация, но думаю кому-нибудь окажется полезным, да и себе в мемориз