计算的列函数类似于在DAX中返回客户度量

时间:2018-08-20 19:30:29

标签: powerbi dax powerbi-desktop

我正在尝试开发DAX计算的列,这些列指示教练分配随时间的变化。我是Power BI和DAX的新手。以下是事实表的示例。现在,我正在查看一位培训师(马里奥),并根据访问日期和培训师列来比较人员是否仍分配给他,是否已被新分配或是否已将其删除。

fact table

我将创建一个仪表板,但在最简单的视图中,我希望输出是这样的(以及最近的访问日期):

output

如果上次访问日期列出了其他培训者,现在又列出了Mario,或者这是第一次访问,则为“新分配”;如果最近两次访问都是与Mario进行的,则为“仍分配”,并且“分配已删除” “如果列出了另一位教练在马里奥之后访问。

在搜索在线论坛后,我认为这类似于随时可用的退货/丢失客户度量,但是我需要在行级别输出,因此我认为我需要使用计算列。根据这些搜索,我创建了一个列,如果Mario是培训师,则该列输出1,并尝试在另一列无效的列中使用MIN / MAX。

这是工作的计算列:

Mario = 
VAR IfMario = CALCULATE (
    FIRSTNONBLANK( fact[Trainer], 1),
    FILTER( ALL (fact[ID]), fact[ID] = "Mario" )
)

RETURN
SWITCH (
TRUE(),
IfMario = "Mario", 1,
0
     )

我不确定如何从这里继续。谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

要创建这样的视图,您不需要计算列(除非您有其他未在问题中提及的原因)。措施将更容易建立。

措施1:

Last Visit Date = MAX(fact[Date])

措施2:

Current Trainer    =
VAR Current_Date = [Last Visit Date]
RETURN
    CALCULATE ( VALUES ( fact[Trainer] ), fact[Date] = Current_Date )

措施3:

Previous Trainer    =
VAR Current_Date = [Last Visit Date]
VAR Previous_Date = CALCULATE ( MAX ( fact[Date] ), fact[Date] < Current_Date )
RETURN
    CALCULATE ( VALUES ( fact[Trainer] ), fact[Date] = Previous_Date )

措施4:

Category    =
SWITCH (
    TRUE (),
    [Current Trainer] =  "Mario" && [Previous Trainer] =  "Mario", "Still Assigned",
    [Current Trainer] =  "Mario" && [Previous Trainer] <> "Mario", "Newly Assigned",
    [Current Trainer] <> "Mario" && [Previous Trainer] =  "Mario", "Assignement Removed"
)

在矩阵行上放置名称,将小数点4和1放到值上,您将获得报告。

注意:

  • 我认为所提供的示例包含一个错误(Jon Snow类别应为“已删除分配”,而不是“新分配”;
  • 无需对“ Mario”进行硬编码,它可以是动态选择的Trainer;
  • 代码依赖于每个日期每个名称一个培训师的假设,否则您将得到一个错误(可以通过使用If(Hasonevalue [fact [Trainer])来防止该错误,...

[编辑:防止多名教员出错]

如果您的客户在同一日期可能有多个培训师,那么VALUES将返回不止1个培训师,这会导致错误。可能的解决方案:

Current Trainer Count:=
VAR Current_Date = [Most Recent]
RETURN  
    COUNTROWS( CALCULATETABLE(Customer, Customer[Date] = Current_Date ))

这种措施将返回每个客户当前的培训师数量。然后修改[当前客户]指标:

Current Trainer:=
VAR Current_Date = [Most Recent]
RETURN
 IF([Current Trainer Count] = 1,  
     CALCULATE( VALUES(Customer[Trainer]), Customer[Date] = Current_Date ),
     "Multiple Trainers")

您可以返回所需的任何内容,而不是“ Multiple Trainers”文本。例如,您可以返回当前的教练人数:

Current Trainer:=VAR Current_Date = [Most Recent]
RETURN
  IF([Current Trainer Count] = 1,  
     CALCULATE( VALUES(Customer[Trainer]), Customer[Date] = Current_Date ),
     [Current Trainer Count] & " trainers"    )

因此,度量将返回“ 2个培训员”,而不是“多个培训员”,等等。

另一种方法是将所有培训师连接到一个定界列表中。例如:

Current Trainer=
VAR Current_Date = [Most Recent]
RETURN
    CONCATENATEX (
        CALCULATETABLE ( Customer, Customer[Date] = Current_Date ),
        Customer[Trainer], "," )

这种措施不需要保护,因为在有多名培训师的情况下,它只会简单列出所有内容:

Current Trainer
"Mario, Yoshi"

当然,您也可以在报告中使用“当前培训师人数”来快速查看此类情况。

相同的逻辑适用于上一培训师。

最后,您需要保护您的[类别]措施免受多重培训师的影响。例如:

Status=
IF([Current Trainer Count] > 1 || [Previous Trainer Count] > 1, "Multiple Trainers", 
SWITCH
(TRUE(),
[Current Trainer] = "Mario" && [Previous Trainer] = "Mario", "Same",
[Current Trainer] = "Mario" && [Previous Trainer] <> "Mario","New",
[Current Trainer] <> "Mario" && [Previous Trainer] = "Mario", "Lost"
))