Power BI - DAX Measure 计算当前期间流失和重新激活的客户。总数不正确
Power BI - DAX Measure to calculate churned and reactivated customers in the current period. Incorrect total
以下是数据的简化版本。客户ID的每日交易清单
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 }
}
)
Objective:计算 当前期间 期间重新激活和流失的客户,在下面的示例中是 2019 年 4 月 1 日至 7 日.
已流失 = 90 天或更长时间不活跃。
重新激活 = 在最近一次购买前 90 天或更长时间处于非活动状态。
在矩阵中 - 如下图所示 - 以下措施按预期在当前期间(4 月 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)
请注意,在这种情况下,"current period" 需要动态显示日期,这就是日期切片器在那里的原因,我在日期列上使用 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)
如屏幕截图所示,矩阵按预期工作。不是总数。我曾尝试使用带有 distinctcount 的计算来相应地计算客户数量,但没有成功。目前,我通过在 excel(!).
中导出矩阵和求和来在我的真实数据集中解决这个问题
必须是使它与 DAX 一起工作的更好方法。
非常感谢您的帮助。
首先,您需要一个与您的 SalesData
table 无关的 Dates
table 用作切片器。以下内容足以满足此处的目的:
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( ... ), ... )
模式对于需要从较低粒度计算汇总的小计很常见。
这里 another question 讨论 SUMX ( VALUES ( ... ), ... )
并包含更多链接。
以下是数据的简化版本。客户ID的每日交易清单
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 }
}
)
Objective:计算 当前期间 期间重新激活和流失的客户,在下面的示例中是 2019 年 4 月 1 日至 7 日.
已流失 = 90 天或更长时间不活跃。
重新激活 = 在最近一次购买前 90 天或更长时间处于非活动状态。
在矩阵中 - 如下图所示 - 以下措施按预期在当前期间(4 月 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)
请注意,在这种情况下,"current period" 需要动态显示日期,这就是日期切片器在那里的原因,我在日期列上使用 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)
如屏幕截图所示,矩阵按预期工作。不是总数。我曾尝试使用带有 distinctcount 的计算来相应地计算客户数量,但没有成功。目前,我通过在 excel(!).
中导出矩阵和求和来在我的真实数据集中解决这个问题必须是使它与 DAX 一起工作的更好方法。
非常感谢您的帮助。
首先,您需要一个与您的 SalesData
table 无关的 Dates
table 用作切片器。以下内容足以满足此处的目的:
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( ... ), ... )
模式对于需要从较低粒度计算汇总的小计很常见。
这里 another question 讨论 SUMX ( VALUES ( ... ), ... )
并包含更多链接。