Создать скользящее среднее значение за 6 месяцев на недельном фильтре - PullRequest
0 голосов
/ 10 декабря 2018

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

Я могу рассчитать скользящее среднее, используяформула ниже:

6 months rolling =
VAR period_end = 
    CALCULATE(
        MAX('Dimensions'[Month Start Date]),
        FILTER(
            ALL('Dimensions'[Year Week]),
            'Dimensions'[Year Week]=SELECTEDVALUE('Dimensions'[Year Week])
        )
    )

VAR period_till = 
    FIRSTDATE( 
        DATESINPERIOD(
            'Dimensions'[Month Start Date], 
            period_end, 
            -1, 
            MONTH
        )
    )

VAR period_start = 
    FIRSTDATE( 
        DATESINPERIOD(
            'Dimensions'[Month Start Date], 
            period_till, 
            -6, 
            MONTH
        )
    )

RETURN
    CALCULATE(
        SUM(Total_Sales),
        DATESBETWEEN(
            [Month Start Date], 
            period_start, 
            period_till
        )
    )

Данные появляются нормально, но как только я помещаю срез на [Year Week], он начинает давать еженедельные данные, а не скользящее среднее.

Я думаю, что мне нужно использовать ВСЕ фильтр, но мои усилия еще не окупились на нем.Цените любую помощь по этому вопросу.

Структура отчета выглядит следующим образом:

Категория

Current_Week_Data

Данные за предыдущий год на той же неделе

разница%

скользящий 6 месяцев (в этом году - предыдущие 6 лет 6 месяцев / предыдущий год 6 месяцев)

1 Ответ

0 голосов
/ 13 декабря 2018

Я думаю, это поможет.Если мы находимся в декабре (как сейчас), он будет суммировать «Данные» [X] за июнь-ноябрь этого года, а также за прошлый год, а затем вычислять дробное изменение.На расчет не повлияет срез на [Year Week]

Rolling n month average = 
var n = 7 //number of months looking back
var currentDate = MAX('Calendar'[Date]) // max date in current context
var startDate = EOMONTH(EDATE(currentDate; -n);0) // end date of the 7th month back
var currentDateLY = currentDate-364 // Monday -> Monday, use 365 if date match is more important. Using 365 also removes strange values in the beginning/end of months.
var startDateLY = EOMONTH(EDATE(currentDateLY; -n); 0)

var theDataTY = // the data This Year
CALCULATE(
    SUM('Data'[X]);
    ALL('Calendar'[Year Week]);
    FILTER(
        ALL('Calendar'[Date]);
        'Calendar'[Date] > ( startDate ) && 'Calendar'[Date] <DATE(YEAR(currentDate);MONTH(currentDate);1) // the 6 month interval 
    )
)
var theDataLY = // the data Last Year
CALCULATE(
    SUM('Data'[X]);
    ALL('Calendar'[Year Week]);
    FILTER(
        ALL('Calendar'[Date]);
        'Calendar'[Date] > ( startDateLY ) && 'Calendar'[Date] <DATE(YEAR(currentDateLY);MONTH(currentDateLY);1) // the 6 month period last year
    )
)

return
DIVIDE( // calculate the fractional change
    theDataTY - theDataLY;
    theDataLY;
    0 // returns 0 if fraction is not defined. 
)

У меня есть две таблицы в моей настройке: «Календарь» и «Данные».Между «Календарь» [Дата] и «Данные» [Дата] существует отношение 1: *.Кроме того, я не сомневаюсь, что есть лучший способ сделать это в DAX, именно так я и сделал бы.

Надеюсь, это поможет.

Приветствия,

Оскар

...