Power BI-DAX度量来计算当前期间的流失和重新激活的客户。总数不正确

时间:2019-04-10 14:59:32

标签: powerbi dax datediff measure

下面是数据的简化版本。客户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 }
    }
)

目标:计算当前期间中的重新激活和搅动的客户,在下面的示例中为 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)

请注意,在这种情况下,“当前期间”需要动态显示日期,这就是为什么日期切片器在那里,我在日期列上使用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 个答案:

答案 0 :(得分:2)

首先,您需要一个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( ... ), ... )模式通常适用于需要从较低粒度计算中汇总的小计。