Еженедельная / ежемесячная / ежеквартальная группировка в запросе - PullRequest
2 голосов
/ 19 марта 2012

Допустим, у меня есть таблица со следующими столбцами

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

ПРИМЕЧАНИЕ (даты установлены только для примера)

То же самое для месяца, года и т. д.

Может кто-топомогите мне с таким запросом?

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

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

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

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 )
/
0 голосов
/ 19 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...