【问题标题】:DAX: How do I write an IF statement to return a calculation for multiple (specific) values selected?DAX:如何编写 IF 语句以返回所选多个(特定)值的计算?
【发布时间】:2019-07-30 09:40:44
【问题描述】:

这让我发疯了。假设我们想使用一个切片器,它有两个不同的值可以从一个维度中选择。有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")

请注意,我需要 this IF() 分支来实际返回使用 A 和 B 值的计算,所以现在我有选择 A 或 B 或 (Blank) 或 All 或 None 的返回值;但没有选择A&B的多个值!

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

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()分支计算以获取所有/ none或非空白或特定的Slicer值时的结果?

我的最大努力: 我希望改进第一个 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()))))

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    想想你要找的是CONTAINSVALUES

    VALUES 将在范围内为您提供独特的当前选择。 CONTAINS 允许您检查表是否包含具有一组值的任何行。

    []

    公式:

    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"
        )
    

    【讨论】:

    • 感谢您的解决方案,mxix!我会试试的。
    • 一位同事在我发布后不久建议使用 Contains(),但我们还没有完全将 Values() 合并到组合中。这看起来不错,就像你描述的那样。我的看法 - DAX 中的 IF() 分支公式具有可重用性和较少的维护作用,尽管更难想象。我这样想没有错吧?我可以很容易地把每个分支写成自己的公式,但是我必须做很多措施。
    • 我现在确实看到这在有/没有 Values() 的情况下都有效 - 添加 Values() 的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2016-08-30
    • 2022-12-06
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多