Суммирование значений предыдущих месяцев на дату строки - PullRequest
1 голос
/ 07 июня 2019

Мне нужен запрос SQL Server, чтобы получить что-то вроде:

Client_ID | REF_DATE | SALES | SALES_PREVIOUS_6_MONTHS | SALES_NEXT_6_MONTHS

Но проблема в том, что моя базовая дата не "Сегодня" или что-то в этом роде. Но на самом деле "REF_DATE".

Итак, если покупатель что-то покупает в июле / 2015, я хочу знать, сколько он потратил в этом базовом месяце (июль / 2015), за предыдущий и следующие 6 месяцев с июля / 2015. Мне нужна линия на август и т. Д.

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

Я попытался использовать оператор CASE WHEN, но, поскольку он возвращает только «FALSE» для моего условия, он возвращает 0.

SELECT
    Client_ID,
    REF_DATE,
    SUM(SALES),
    CASE 
       WHEN REF_DATE BETWEEN DATEADD(MONTH, -6, REF_DATE) AND DATEADD(MONTH, -1, REF_DATE) 
          THEN SUM(SALES) 
          ELSE 0.0 
    END AS SALES_PREVIOUS_6_MONTHS,
    CASE 
       WHEN REF_DATE BETWEEN DATEADD(MONTH, +1, REF_DATE) AND DATEADD(MONTH, +6, REF_DATE) 
          THEN SUM(SALES) 
          ELSE 0.0 
    END AS SALES_NEXT_6_MONTHS
FROM
    dbo.invoices         
GROUP BY
    Client_ID, REF_DATE

Мой желаемый результат - что-то вроде:

+------------+------------+---------+---------------------------+----------------------+
| Client_ID  |  REF_DATE  |  SALES  |  SALES_PREVIOUS_6_MONTHS  |  SALES_NEXT_6_MONTHS |
+------------+------------+---------+---------------------------+----------------------+
|          1 | 01/07/2014 |       0 |                         0 |                 1234 |
|          1 | 01/08/2014 |       0 |                         0 |                 3579 |
|          1 | 01/09/2014 |       0 |                         0 |                 7035 |
|          1 | 01/10/2014 |       0 |                         0 |                11602 |
|          1 | 01/11/2014 |       0 |                         0 |                12836 |
|          1 | 01/12/2014 |       0 |                         0 |                17403 |
|          1 | 01/01/2015 |    1234 |                         0 |                24059 |
|          1 | 01/02/2015 |    2345 |                      1234 |                21714 |
|          1 | 01/03/2015 |    3456 |                      3579 |                18258 |
|          1 | 01/04/2015 |    4567 |                      7035 |                13691 |
|          1 | 01/05/2015 |    1234 |                     11602 |                12457 |
|          1 | 01/06/2015 |    4567 |                     12836 |                 7890 |
|          1 | 01/07/2015 |    7890 |                     17403 |                    0 |
|          1 | 01/08/2015 |       0 |                     24059 |                    0 |
|          1 | 01/09/2015 |       0 |                     21714 |                    0 |
|          1 | 01/10/2015 |       0 |                     18258 |                    0 |
|          1 | 01/11/2015 |       0 |                     13691 |                    0 |
|          1 | 01/12/2015 |       0 |                     12457 |                    0 |
+------------+------------+---------+---------------------------+----------------------+

1 Ответ

2 голосов
/ 07 июня 2019

Если у вас есть запись для каждого клиента за каждый месяц:

SELECT Client_ID, REF_DATE, SUM(SALES),
       SUM(SUM(SALES)) OVER (PARTITION BY Client_id ORDER BY REF_DATE ROWS BETWEEN 6 PRECEDING AND 1 PRECEDING) as SALES_PREVIOUS_6_MONTHS,
       SUM(SUM(SALES)) OVER (PARTITION BY Client_id ORDER BY REF_DATE ROWS BETWEEN 1 FOLLOWING AND 6 FOLLOWING) as SALES_NEXT_6_MONTHS,
FROM dbo.invoices i  
GROUP BY Client_ID, REF_DATE;

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

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