DAX:如何编写IF语句以返回针对多个(特定)选定值的计算?

时间:2019-03-08 11:00:02

标签: powerbi dax

这真让我发疯。假设我们要使用具有两个不同值的切片器,以便从维度中进行选择。有A和B。

我们也要说我的事实表与此维度相关联,但是它具有相同的维度,具有更多选项。

我的切片器现在具有A,B和(空白)。没关系。

现在让我们说,我想通过在DAX公式中选择切片器来列出所有可能的计算结果,但是在我的视觉中,我需要将所有这些结果都列在 IF()中分支公式:

我可以列出A:

IF(MAX(SlicerDim[Column]) = "A", CALCULATE([Calculation], SlicerDim[Column] = "A")

我可以列出B:

IF(MAX(SlicerDim[Column]) = "A", CALCULATE([Calculation], SlicerDim[Column] = "A")

我也可以列出(空白)计算:

CALCULATE([Calculation], SlicerDim[Column] = Blank())

即使使用了所有切片器元素,我也设法使用以下方法来进行计算:

NOT(ISFILTERED(SlicerDim[Column])), CALCULATE([Calculation], SlicerDim[Column] = "A" || SlicerDim[Column] = "B")

注意,我需要这个分支才能实际使用A和B值返回计算结果,所以现在有了选择A或B或(空白)或选择All或None时的返回值;但是,如果选择了A和B的多个值,则不会!

我如何写出该IF()分支以使其返回相同的值,但是同时选择了A和B?由于切片器中只有两个 real 选项-我设法使用MIN()和MAX()通过使用它们的名称或索引号使其工作。

IF((MIN(SlicerDim[Column]) = "A" && MAX(SlicerDim[Column]) = "B") || NOT(ISFILTERED(Paslauga[Paslauga])), CALCULATE([Calculation], SlicerDim[Column] = "A" || SlicerDim[Column] = "B")

但是-我想要一个更易于理解/稳健/可重用的公式,以便我可以从限幅器中列出许多可选值,并让其返回针对特定选定限幅器值的计算。

请帮忙。 我一直在搜寻高点和低点,似乎没有简单的方法可以解决此问题,尽管会刮擦IF路径,而只是使用该死的切片机来解决这种难题。

TL; DR: 选择全/无或非空白或特定切片器值时,如何使用DAX编写IF()分支计算以得到结果?

我最大的努力: 我希望改进第一个IF()分支,而不必使用MIN / MAX,因为如果切片器中有两个以上的实际选项,我希望能够重用这种类型的公式:

IF_branch = 
IF((MIN(SlicerDim[Column]) = "A" && MAX(SlicerDim[Column]) = "B" || NOT(ISFILTERED(SlicerDim[Column])), CALCULATE([Calculation], SlicerDim[Column] = "A" || SlicerDim[Column] = "B"),
IF(MAX(SlicerDim[Column]) = "A", CALCULATE([Calculation], SlicerDim[Column] = "A"),
IF(MAX(SlicerDim[Column]) = "B", CALCULATE([Calculation], SlicerDim[Column] = "B"),
CALCULATE([Calculation], SlicerDim[Column] = BLANK()))))

编辑:2019年3月11日 请参考mxix的答案-正是这里所需要的。干得好,mxix!

1 个答案:

答案 0 :(得分:1)

认为您正在寻找的是CONTAINSVALUES

VALUES将为您提供范围内不同的当前选择。 CONTAINS可让您检查表是否包含具有一组值的任何行。

[Example]

公式:

selected Scenarios = CONCATENATEX(VALUES(DimScenario[ScenarioName]);[ScenarioName];";")

Contains Forecast and Budget? = 
    IF(
        CONTAINS(VALUES(DimScenario[ScenarioName]);[ScenarioName];"Forecast") &&
        CONTAINS(VALUES(DimScenario[ScenarioName]);[ScenarioName];"Budget")
        ;"Yes"
        ;"No"
    )