2012-03-19 3 views
2

Допустим, у меня есть таблица со следующими столбцамиЕженедельно/ежемесячно/ежеквартально группировка в запросе

1. Client - string. 
2. Profit - integer. 
3. Deal_Date - date. 

мне нужен запрос, который будет извлекать сумму пробое прибыли за неделю/месяц/кватер и т.д.

Ожидаемое выход для

1 row, sum (profit) of all deals that registered from (03.19.2012 - 03.12.2012). 
2 row, sum (profit) of all deals that registered from (03.12.2012 - 03.05.2012). 
... 
n row, sum (profit) of all deals that registered from (05.17.2011 - 05.10.2011). 

NOTE (сроки, установленные только для примера) недель

То же самое за месяц, лет и т. Д.

Может ли кто-нибудь помочь мне с таким запросом?

Btw производительность очень важна.

+1

заявление на использование –

+0

Не могли бы вы отобразить вывод, который хотите? Какой диапазон дат вам нужно представлять? Когда вы говорите, что «производительность очень важна», каковы ваши критерии? Сколько данных вы говорите? – APC

+0

Возможный дубликат [Группа SQL по частоте в диапазоне дат] (http://stackoverflow.com/questions/8640138/sql-group-by-frequency-within-a-date-range) –

ответ

4

Этот запрос использует простые форматы дат для извлечения различных элементов, которые вы хотите отслеживать, и аналитики для получения сумм.

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) 
/

Это приведет к созданию одной строки для каждой строки текущей таблицы. Таким образом, вы, вероятно, захотите обернуть его в следующий внешний запрос, который возвращает только отдельные строки.

Вариантом будет использование rollup вместо этого. Я не уверен, насколько хорошо это работает, когда критерии группировки не являются совершенно иерархическими (недели не подходят аккуратно в кварталы).

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) 
/
-2

Просто сделайте SP и закодируйте код для каждой недели или месяца или года, как вы пожелаете.

+2

Это было бы плохо ответ в 1997 году, но Row By Agonizing Row теперь неприемлемо. В последние пятнадцать лет Oracle действительно продвигается вперед и имеет множество различных, более эффективных вариантов. – APC

Смежные вопросы