Сумма окна с условием в таблице - PullRequest
0 голосов
/ 06 сентября 2018

Использование таблицы 10.5 Я пытаюсь создать таблицу / график, который отображает итоги новых («Постоянный старт») продаж за скользящее 52-недельное окно. Изображение диаграммы ниже показывает сумму продаж по неделям от новых (постоянных клиентов) в пределах 52-недельного окна, охватывающего неделю ISO 201733–201832; строка показывает промежуточный итог продаж.

Running Total of New Sales

На следующем рисунке показаны данные за последние несколько недель для графика.

Underlying chart data

«Новые продажи» определяются как клиенты с начальной неделей в течение 52 недель после отчетной недели / недели ISO (в примере, где 201832 - неделя отчета, включаются клиенты с начальной неделей между 201733 и 201832). Промежуточный итог продаж между этими же неделями берется, при этом значение процентов представляет собой текущее итоговое значение за последнюю неделю (в примере 5 046 546).

Мне нужно отобразить соответствующее 52-недельное итоговое значение для каждой отчетной недели (таким образом, значения будут составлять около 5 миллионов в неделю), и столбцы будут относительно плоскими (с учетом роста продаж и т. Д.). Моя конкретная проблема заключается в том, что я не могу понять, как определить окно (т. Е. Только новые учетные записи) при выполнении расчета окна / перемещения.

Надеюсь, мое описание достаточно ясно, чтобы проиллюстрировать мою цель.

Заранее спасибо.

РЕДАКТИРОВАТЬ / ОБНОВИТЬ (для дальнейшего уточнения вопроса):

В следующем примере таблицы показаны продажи, совершенные в период между 201824 и 201827 гг. Со счетов, открытых за тот же период. В течение недели 201824 продажи имели только счета, открытые в 201824 году (значение 1). На неделе 201825 г. теперь есть две недели счетов: открытые на неделе 201824 и открытые на неделе 201825, в результате продажи составили 2 и 1 соответственно. Каждая последующая неделя имеет дополнительные счета на одну неделю, что способствует общему объему продаж 20.

+--------+--------+--------+--------+
| 201824 | 201825 | 201826 | 201827 |
+--------+--------+--------+--------+
|        |        |        |      1 |
|        |        |      1 |      2 |
|        |      1 |      2 |      3 |
|      1 |      2 |      3 |      4 |
+--------+--------+--------+--------+

Для продолжения примера в следующей таблице приведены аналогичные данные, но с периодом времени, перемещенным на 1 неделю:

+--------+--------+--------+--------+
| 201825 | 201826 | 201827 | 201828 |
+--------+--------+--------+--------+
|        |        |        |      2 |
|        |        |      2 |      3 |
|        |      2 |      3 |      4 |
|      2 |      3 |      4 |      5 |
+--------+--------+--------+--------+

Сумма продаж в этой таблице составляет 30: счета, открытые на неделе 201825, дают 14 (2 + 3 + 4 + 5), счета, открытые на второй неделе, дают 9 (2 + 3 + 4) и так далее.

Эти две таблицы описывают методологию, которую я ищу, и результаты, которые я ищу, будут примерно такими:

+--------+--------+
| 201827 | 201828 |
+--------+--------+
|     20 |     30 |
+--------+--------+

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

;with d AS 
(
    select s.ISOWk, a.OSW as StartWeek, sum(s.Sales) as Sales
    from accs a
    join sales s
        on a.ID = s.ID
    where s.ISOWk >= 201701
        and a.OSW >= 201701
    group by s.ISOWk, a.OSW
)
select c.ISOWk, sum(case when d.ISOWk between FYS and c.ISOWk and StartWeek between FYS and c.ISOWk then Vol else 0 end) as Rolling_ss_vol
from d
cross join (select distinct ISOWk, FYS from tblCalendar c where ISOWk between 201801 and 201835) c
group by c.ISOWk
order by ISOWk

Где FYS (начало года) связано с неделей ISO и указывает, когда начался текущий период продаж (т. Е. За 52 недели).

1 Ответ

0 голосов
/ 06 сентября 2018

Я конвертировал изо-даты в обычные даты в вашем файле примера. Это облегчило вычисление DATEDIFF. Я нашел эту формулу на форуме Tableau для этого преобразования.

DATEADD('week',INT(MID(STR([Start Week]), 5,2))-1,DATE("01/01/"+(MID(STR([Start Week]), 1,4))))

Я повторил то же самое для недели клиента.

Затем сделал LOD [cust start], чтобы убедиться, что я правильно вычислил дату.

{fixed [Cust No] : min([start_week_date])}

Затем заполняется поле [Продажи в течение 52]

if datediff('week',[cust start], [iso_week_date])<52 then [Sales] end

Наконец, [window_sum_sales] использует [Sales in 52] внутри него.

window_sum(sum([Sales within 52]),-51,0)

Надеюсь, это то, что вы ищете.

ссылка на рабочую книгу https://www.dropbox.com/s/wxw5e2783la4fl4/20180906_stackoverflow_question.twbx?dl=0

...