Рассчитать YTD и предыдущую YTD для любого месяца с использованием SQL - PullRequest
0 голосов
/ 29 июня 2018

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

Таблица будет выглядеть примерно так

USER1 | MONTH | YEAR | REVENUE | YTD REVENUE | PRIOR YTD REVENUE |
------------------------------------------------------------------
Dan   | Feb   | 2016 |  $75    |   $75       |                   
Bob   | Feb   | 2016 |         |             |                   
Chris | Feb   | 2016 |  $220   |   $220      |     
Dan   | Jan   | 2017 |  $100   |   $100      |     
Bob   | Jan   | 2017 |  $150   |   $150      |     
Chris | Jan   | 2017 |  $200   |   $200      |     
Dan   | Feb   | 2017 |  $100   |   $200      |     $75
Bob   | Feb   | 2017 |  $100   |   $250      |     
Chris | Feb   | 2017 |  $125   |   $225      |     $220

Как я могу рассчитать текущую и предыдущую доходность с начала года через sql по месяцам в рамках построения указанного представления? В настоящее время я не рассчитываю YTD по месяцам / годам, как в приведенном выше примере, поэтому необходимо включить это в отчет вместе с расчетом PYTD.

В настоящее время SQL-запрос

Select USER1, MONTH(Date), YEAR(Date), REVENUE from SOURCE 

1 Ответ

0 голосов
/ 29 июня 2018

Вы бы использовали оконные функции. Предполагается, что «месяц» - это действительно столбец с номером месяца. Это имеет больше смысла, чем месяц:

select t.*,
       lag(ytd) over (partition by user1, month order by year) as prev_ytd
from (select t.*,
             sum(revenue) over (partition by user1, year order by month) as ytd
      from t
     ) t;

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

EDIT:

Если вам не хватает строк:

with tc as (
      select t.*,
             sum(revenue) over (partition by user1, year order by month) as ytd
      from t
     )
select tc.*, tcprev.ytd
from tc outer apply
     (select top (1) tcprev.ytd
      from tc tcprev
      where tcprev.user1 = tc.user1 and
            tcprev.year = tc.year and
            tcprev.month <= tc.month
      order by tcprev desc
     ) tcprev;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...