Суммируйте каждые 7 строк от продаж колонки, в то время как целые числа, представляющие n дней до установки рекламного материала (до и после установки) - PullRequest
3 голосов
/ 20 мая 2019

2 магазина, каждый со своими данными о продажах в день. Оба получают рекламные материалы, но не в один и тот же день. После pr_day рекламные материалы останутся там. Это означает, что со дня установки рекламного материала должен быть рост продаж.

Installation Date:
Store A    -    05/15/2019
Store B    -    05/17/2019

Чтобы увидеть, была ли рекламная акция успешной, мы измеряем продажи до даты pr и после, возвращая количество продаж (не выручки, а проданных штук) рядом с int, указывая, как далеко оно было от pr-дня : (сумма продаж в обоих магазинах)

pr_date|    sales
-28    |    35
-27    |    40
-26    |    21
-25    |    36
-24    |    29
-23    |    36
-22    |    43
-21    |    31
-20    |    32
-19    |    21
-18    |    17
-17    |    34
-16    |    34
-15    |    37
-14    |    32
-13    |    29
-12    |    25
-11    |    45
-10    |    43
-9     |    26
-8     |    27
-7     |    33
-6     |    36
-5     |    17
-4     |    34
-3     |    33
-2     |    21
-1     |    28
1      |    16
2      |    6
3      |    16
4      |    29
5      |    32
6      |    30
7      |    30
8      |    30
9      |    17
10     |    12
11     |    35
12     |    30
13     |    15
14     |    28
15     |    14
16     |    16
17     |    13
18     |    27
19     |    22
20     |    34
21     |    33
22     |    22
23     |    13
24     |    35
25     |    28
26     |    19
27     |    17
28     |    29

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

Проблема начинается с другой даты установки pr-материала. Если я сгруппирую по дням недели, это объединит продажи в разные дни после установки. Это просто начнется в любой день недели, который я определю:

Select DATEDIFF(wk, change_date, sales_date), sum(sales)
from tbl_sales
group by DATEDIFF(wk, change_date, sales_date)

result:
    week | sales
    -4   | 75
    -3   | 228
    -2   | 204
    -1   | 235
    0    | 149
    1    | 173
    2    | 151
    3    | 167
    4    | 141

числа не из правильных дней, и у многих есть одна неделя. Полагаю, это происходит из sql, группирующей продажи, начиная с воскресенья, и поскольку pr_dates отличаются, генерируется не только 8 недель (4 до, 4 после)

пытаясь найти устойчивое решение, я не смог найти подходящее решение и решил опубликовать его здесь. Большое спасибо за все мысли сообщества об этой теме. Совершенно уверен, что есть разумное решение для этой проблемы, потому что это не похоже на редкий запрос для меня

Я тоже попробовал с этим, но я не вижу, как сложить 7 дней вместе, так как они больше не даты, а дельта к pr-дате

Desired Result:
week | sales
-4   | 240
-3   | 206
-2   | 227
-1   | 202
1    | 159
2    | 167
3    | 159
4    | 163

Приложение из моего анализа от руки, какими должны быть результаты:

enter image description here

Зачем мне нужна еженедельная сводка -> Магазины работают по-разному в зависимости от дня недели. Подводя итоги 7 дней вместе, я убедился, что мы не сравниваем понедельники с воскресеньями и так далее. Кроме того, результат будет представлен в виде линейной или временной диаграммы, где вы можете увидеть уродливое изменение дня недели. Это означает, что вашим глазам будет трудно увидеть тенденцию / развитие продаж. Принимая во внимание, что еженедельное сравнение поглотит эти изменения.

Если что-то неясно, пожалуйста, дайте мне знать, чтобы я мог предоставить вам более подробную информацию

Большое спасибо

Дополнительно приведен обзор даты установки: enter image description here

Shop A:
store A     
delta   date    sales
-28 17.04.2019  20
-27 18.04.2019  20
-26 19.04.2019  13
-25 20.04.2019  25
-24 21.04.2019  16
-23 22.04.2019  20
-22 23.04.2019  26
-21 24.04.2019  15
-20 25.04.2019  20
-19 26.04.2019  13
-18 27.04.2019  13
-17 28.04.2019  20
-16 29.04.2019  21
-15 30.04.2019  20
-14 01.05.2019  17
-13 02.05.2019  13
-12 03.05.2019  9
-11 04.05.2019  34
-10 05.05.2019  28
-9  06.05.2019  19
-8  07.05.2019  14
-7  08.05.2019  23
-6  09.05.2019  18
-5  10.05.2019  9
-4  11.05.2019  22
-3  12.05.2019  17
-2  13.05.2019  14
-1  14.05.2019  19
0   15.05.2019  11
1   16.05.2019  0
2   17.05.2019  0
3   18.05.2019  1
4   19.05.2019  19
5   20.05.2019  18
6   21.05.2019  14
7   22.05.2019  11
8   23.05.2019  12
9   24.05.2019  8
10  25.05.2019  7
11  26.05.2019  19
12  27.05.2019  15
13  28.05.2019  15
14  29.05.2019  11
15  30.05.2019  5
16  31.05.2019  8
17  01.06.2019  10
18  02.06.2019  19
19  03.06.2019  14
20  04.06.2019  21
21  05.06.2019  22
22  06.06.2019  7
23  07.06.2019  6
24  08.06.2019  23
25  09.06.2019  17
26  10.06.2019  9
27  11.06.2019  8
28  12.06.2019  23

Shop B:
store B     
delta   date    sales


-28 19.04.2019  15
-27 20.04.2019  20
-26 21.04.2019  8
-25 22.04.2019  11
-24 23.04.2019  13
-23 24.04.2019  16
-22 25.04.2019  17
-21 26.04.2019  16
-20 27.04.2019  12
-19 28.04.2019  8
-18 29.04.2019  4
-17 30.04.2019  14
-16 01.05.2019  13
-15 02.05.2019  17
-14 03.05.2019  15
-13 04.05.2019  16
-12 05.05.2019  16
-11 06.05.2019  11
-10 07.05.2019  15
-9  08.05.2019  7
-8  09.05.2019  13
-7  10.05.2019  10
-6  11.05.2019  18
-5  12.05.2019  8
-4  13.05.2019  12
-3  14.05.2019  16
-2  15.05.2019  7
-1  16.05.2019  9
0   17.05.2019  9
1   18.05.2019  16
2   19.05.2019  6
3   20.05.2019  15
4   21.05.2019  10
5   22.05.2019  14
6   23.05.2019  16
7   24.05.2019  19
8   25.05.2019  18
9   26.05.2019  9
10  27.05.2019  5
11  28.05.2019  16
12  29.05.2019  15
13  30.05.2019  17
14  31.05.2019  9
15  01.06.2019  8
16  02.06.2019  3
17  03.06.2019  8
18  04.06.2019  8
19  05.06.2019  13
20  06.06.2019  11
21  07.06.2019  15
22  08.06.2019  7
23  09.06.2019  12
24  10.06.2019  11
25  11.06.2019  10
26  12.06.2019  9
27  13.06.2019  6
28  14.06.2019  9

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Попробуйте

select wk, sum(sales) 
from (
    select 
         isnull(sa.sales,0) + isnull(sb.sales,0) sales
       , isnull(sa.delta , sb.delta) delta
       , case when isnull(sa.delta , sb.delta) = 0 then 0 
                  else case when isnull(sa.delta , sb.delta) > 0 then (isnull(sa.delta , sb.delta) -1) /7 +1
                            else (isnull(sa.delta , sb.delta) +1) /7 -1
                       end
             end wk
    from shopA  sa
    full join  shopB sb on sa.delta=sb.delta 
    ) t
group by wk;

sql скрипка

Более читаемая версия, она не работает быстрее, просто использование CROSS APLLY таким образом позволяет создавать некие промежуточные переменные для более чистого кода.

select wk, sum(sales) 
from (
    select 
         isnull(sa.sales,0) + isnull(sb.sales,0) sales
       , dlt delta
       , case when dlt = 0 then 0 
                  else case when dlt > 0 then (dlt - 1) / 7 + 1
                            else (dlt + 1) / 7 - 1
                       end
             end wk
    from shopA sa
    full join shopB sb on sa.delta=sb.delta
    cross apply (
      select dlt = isnull(sa.delta, sb.delta)
    ) tmp
) t
group by wk;

Наконец, если у вас уже есть запрос, который создает набор данных с (pr_date, sales) столбцами

select wk, sum(sales) 
from (
      select sales
        , case when pr_date = 0 then 0 
                  else case when pr_date > 0 then (pr_date - 1) / 7 + 1
                            else (pr_date + 1) / 7 - 1
                       end
             end wk
      from (
           -- ... you query here ... 
           )pr_date_sales
    ) t
group by wk;
0 голосов
/ 20 мая 2019

Я думаю, вам просто нужно взять разницу в день и использовать арифметику.Использование datediff() с week считает границы недели - это не то, что вам нужно.То есть, это нормализует недели к календарным неделям.

Вы хотите пропустить день промоушена, что делает это немного сложнее.

Я думаю, что это логика:

Select v.week_diff, sum(sales)
from tbl_sales s cross join
     (values (case when change_date < sales_date
                   then (datediff(day, change_date, sales_date) + 1) / 7
                   else (datediff(day, change_date, sales_date) - 1) / 7
              end)
     ) v(week_diff)
where change_date <> sales_date
group by v.week_diff;

Возможно, возникла проблема «один на один», в зависимости от того, что вы действительно хотите сделать, когда даты совпадают.

...