DAX Рассчитать год к дате - год к предыдущему месяцу (смена года) - PullRequest
0 голосов
/ 05 апреля 2019

Попытка выяснить, как рассчитать эквивалент с начала года, но до предыдущего месяца, когда год меняется.

Например:

Date    | Value
2018-10 | 100 
2018-11 | 100 
2018-12 | 100 
2019-01 | 100
2019-02 | 100
2019-03 | 100

Ожидаемые результаты:

При выборе 2019-03

С начала года = 300 (накоплено с 2019-01 по 2019-03 гг.)

Суммарно накопленный предыдущий месяц = ​​200 (накоплено с 2019-01 по 2019-02)

При выборе 2019-01

С начала года = 100

За предыдущий месяц накоплено = 300 (накоплено с 2018-10 по 2018-12)

I 'мы пробовали:

Value_Accum_PreviousMonth:=TOTALYTD([Value];Calendar[Date]) - [Value]

но со сменой года это не работает

Есть идеи?

1 Ответ

1 голос
/ 06 апреля 2019

Отказ от ответственности - я создал это решение с помощью Power BI.Формула должна быть перенесена в Excel / PowerPivot, но для этого могут потребоваться некоторые незначительные изменения.


Хотя функции анализа времени DAX очень полезны, мне кажется, что меня тянет к ручному подходу вычисления YTD, в предыдущем году и т. д. Имея это в виду, именно так я бы решил вашу проблему.

Во-первых, я бы сделал меру, представляющую собой просто сумму вашего столбца Value.Наличие этой меры просто приятно в будущем;не является абсолютной необходимостью.

Total Value = SUM(Data[Value])

Далее, для использования для расчета YTD вручную на основе предыдущего месяца нам нужно знать две вещи: 1) каков целевой месяц (т. е. предыдущий месяц) и 2) каков год этого месяца.

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

Первое, что нам нужно, это выбранное значение (или максимальная дата в случае отсутствия выбора).

VAR SelectedDate = MAX(Data[Date])

С этой датой мы можем рассчитать TargetYear и TargetMonth.Оба они - простые операторы IF, чтобы поймать пересечение января / декабря.

VAR TargetYear = IF(MONTH(SelectedDate) = 1, YEAR(SelectedDate) - 1, YEAR(SelectedDate))
VAR TargetMonth = IF(MONTH(SelectedDate) = 1, 12, MONTH(SelectedDate) - 1)

Имея все необходимые нам значения, мы пишем оператор CALCULATE, который фильтрует данные по TargetYear и месяцу.меньше или равно TargetMonth.

CALCULATE([Total Value], FILTER(ALL(Data), YEAR([Date]) = TargetYear && MONTH([Date]) <= TargetMonth))

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

Prior Month YTD = 
VAR SelectedDate = MAX(Data[Date])
VAR TargetYear = IF(MONTH(SelectedDate) = 1, YEAR(SelectedDate) - 1, YEAR(SelectedDate))
VAR TargetMonth = IF(MONTH(SelectedDate) = 1, 12, MONTH(SelectedDate) - 1)

RETURN
    CALCULATE([Total Value], FILTER(ALL(Data), YEAR([Date]) = TargetYear && MONTH([Date]) <= TargetMonth))

Result

...