В этом запросе используются простые форматы даты для извлечения различных элементов, которые вы хотите отслеживать, и аналитики для получения сумм.
select client
, yr
, qtr
, wk
, sum ( profit ) over ( partition by client, yr) as yr_profit
, sum ( profit ) over ( partition by client, yr, qtr) as qtr_profit
, sum ( profit ) over ( partition by client, yr, wk) as wk_profit
from (
select client
, profit
, to_char(deal_date, 'yyyy') as yr
, to_char(deal_date, 'q') as qt
, to_char(deal_date, 'ww') as wk
from your_table )
/
Это создаст одну строку для каждой строки в текущей таблице.Таким образом, вы, вероятно, захотите заключить его в следующий внешний запрос, который возвращает только отдельные строки.
Вариант будет использовать вместо этого свертку.Я не уверен, насколько хорошо это работает, когда критерии группировки не совсем иерархичны (недели не вписываются в кварталы).
select client
, yr
, qtr
, wk
, sum ( profit ) as profit
from (
select client
, profit
, to_char(deal_date, 'yyyy') as yr
, to_char(deal_date, 'q') as qt
, to_char(deal_date, 'ww') as wk
from your_table )
group by rollup ( client, yr, qtr, wk )
/