Power BI - DAX Измерение для расчета оттока и повторной активации клиентов в текущем периоде.Неверный итог - PullRequest
4 голосов
/ 10 апреля 2019

Ниже приведена упрощенная версия данных. Ежедневный список транзакций для идентификатора клиента

SalesData = 
DATATABLE (
    "Customer ID", INTEGER,
    "Date", DATETIME,
    "Amount", INTEGER,
    {
         { 101245, "2019/04/07", 500 },
         { 101245, "2018/08/05", 400 },
         { 100365, "2018/07/30", 900 },
         { 100365, "2018/02/22", 700 },
         { 104300, "2019/04/05", 300 },
         { 104300, "2019/04/03", 350 },
         { 104300, "2019/04/01", 310 },
         { 107804, "2018/11/08", 650 },
         { 107804, "2018/11/19", 640 },
         { 108040, "2019/01/02", 730 }
    }
)

Цель: вычислить число повторно активированных и отработанных клиентов в течение текущего периода , который в приведенном ниже примере равен 1-7 апреля 2019 .

Сбитый = Неактивный в течение 90 дней и более.

Реактивировано = Неактивно в течение 90 дней или более до совершения последней покупки.

В матрице - как показано ниже - следующие показатели работают, как и ожидалось, для реактивированных и отточенных в текущем периоде, с 1 по 7 апреля .

    churnedInCurrentPeriod = 
    VAR dayspassed =
    DATEDIFF(
        MAX(SalesData[Date]),
        CALCULATE(
            MAX(SalesData[Date]),
            ALLEXCEPT(SalesData,SalesData[Date])),
            DAY)
    Return 
    IF(dayspassed >= 90 && dayspassed <= 97,1,0)

Обратите внимание, что «текущий период» в этом случае должен быть динамическим по отношению к дате, поэтому здесь есть срез даты, и я использую allexpect в столбце даты, чтобы он работал. В операторе if это 90 + 7 дней, оно должно быть динамичным.

ReactivatedInCurrentPeriod = 
VAR differenceDays =
DATEDIFF(
    CALCULATE(
        MAX(SalesData[Date]),
        FILTER(SalesData,SalesData[Date] <> MAX(SalesData[Date])
        )
    ),
    MAX(SalesData[Date]),
    DAY
)
RETURN 
IF(AND(differenceDays >= 90,MAX(SalesData[Date]) >= DATE(2019,4,1)),1,0)

enter image description here

Как видно на скриншоте, матрица работает как положено. Не итоги. Я пытался использовать метод расчета с меткой подсчета, чтобы подсчитать количество клиентов соответственно, но безуспешно. В настоящее время я решаю эту проблему в своем реальном наборе данных, экспортируя матрицу и сумму в excel (!).

Должен быть лучший способ заставить эту работу работать с DAX.

Большое спасибо за помощь.

1 Ответ

2 голосов
/ 10 апреля 2019

Во-первых, вам нужна таблица Dates без связи с вашей таблицей SalesData для использования в качестве слайсера.Для целей здесь достаточно хорошо работает следующее:

Dates = CALENDAR( DATE( 2018, 1, 1 ), DATE( 2019, 12, 31 ) )

Когда вы используете это в качестве среза, вы можете прочитать максимальную и минимальную даты, чтобы получить динамический период, подобный этому:

ChurnedInPeriod =
VAR MaxDate = MAX ( Dates[Date] )
VAR MinDate = MIN ( Dates[Date] )
VAR CustomerLastDate = CALCULATE ( MAX ( SalesData[Date] ), SalesData[Date] <= MaxDate )
VAR DaysPassed = MaxDate - CustomerLastDate
VAR PeriodLength = MaxDate - MinDate
RETURN
    IF ( DaysPassed >= 90 && DaysPassed <= 90 + PeriodLength, 1, 0 )

Это не решает проблему промежуточных итогов, но теперь вы можете написать новую меру, в которой используется вышеуказанное:

ChurnedCount = SUMX ( VALUES ( SalesData[Customer ID] ), [ChurnedInPeriod] )

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

Ключевым моментом здесь является то, что вам нужно оценить ChurnedInPeriod для каждого клиента в отдельности, и это именно то, что делает ChurnedCount.Для каждого отдельного клиента он оценивает ChurnedInPeriod для этого и затем складывает их все вместе.Этот шаблон SUMX ( VALUES( ... ), ... ) является общим для промежуточных итогов, которые необходимо свернуть из вычислений с более низкой гранулярностью.


Вот другой вопрос , в котором обсуждаются SUMX ( VALUES ( ... ), ... ) и включаются дополнительные ссылки.

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