Этот тип запроса лучше всего обрабатывать, если у вас есть вторая «служебная» таблица, которую вы можете использовать практически для любого запроса, где вам нужно преобразовать диапазоны в определенные сегменты. Таблица утилит представляет собой не более чем список чисел:
CREATE TABLE Iterator (Counter NUMBER);
COUNTER
-------
0
1
2
3
...
100 (or however many rows you want to include)
Если мы предполагаем, что вы хотите отобразить 30 дней, например,
SELECT TO_DATE('6/1/2009', 'MM/DD/YYYY') + i.counter thedate
, i.My_option
, count(y.My_option)
FROM ( SELECT DISTINCT
i2.Counter
, y.My_option
FROM iterator i2
, YourTable y
WHERE i2.Counter < 5
) i
LEFT OUTER JOIN yourtable y
ON TO_DATE('6/1/2009', 'MM/DD/YYYY') + i.counter
>= y.start_date
AND TO_DATE('6/1/2009', 'MM/DD/YYYY') + i.counter
< y.end_date
AND y.My_option = i.My_option
GROUP BY TO_DATE('6/1/2009', 'MM/DD/YYYY') + i.counter
, i.My_option
ORDER BY 1
, 2;
Идея состоит в том, что вы создаете декартово произведение между таблицей итераторов и таблицей с диапазоном, а затем отфильтровываете все случаи, когда условия диапазона не выполняются. Вы можете использовать это во многих местах, и это один из лучших примеров, почему лучше моделировать ваши данные с диапазонами, а не с дискретными интервалами - потому что вы всегда можете легко конвертировать в дискретные интервалы, используя эту технику.
edit: я действительно не должен использовать BETWEEN для запросов диапазона дат - я изменил его на> = <</p>