0

我正在尝试开发 DAX 计算列,以指示随着时间的推移培训师分配的变化。我对 Power BI 和 DAX 比较陌生。下面是一个事实表的例子。现在,我正在查看一位培训师(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
     )

我不知道如何从这里开始。感谢您的帮助!

4

1 回答 1

2

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

措施一:

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 类别应该是“Assignment Removed”,而不是“Newly assignment”;
  • 无需对“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 Customer]度量:

Current Trainer:=
VAR Current_Date = [Most Recent]
RETURN
 IF([Current Trainer Count] = 1,  
     CALCULATE( VALUES(Customer[Trainer]), Customer[Date] = Current_Date ),
     "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"    )

因此,measure 将返回“2 个培训师”,而不是“多个培训师”,等等。

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

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

这种措施不需要保护,因为如果有多个培训师,它会简单地列出它们:

Current Trainer
"Mario, Yoshi"

当然,您也可以在报告中使用“Current Trainer Count”,快速查看此类场景。

相同的逻辑适用于前任培训师。

最后,您需要保护您的 [Category] ​​度量不受多培训师场景的影响。例如:

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"
))
于 2018-08-21T01:07:55.023 回答