首页 > 解决方案 > DAX 使用 IF 和 AND 函数

问题描述

我正在尝试创建一个带有值和预测的趋势表。预测需要从当前月份开始。我正在使用这个 dax 函数:

Spend Forecast =
IF (
    OR (
        DIVIDE (
            CALCULATE (
                SUM ( refv_Spend_Cap[Spend_2019] ),
                FILTER ( refv_Spend_Cap, refv_Spend_Cap[Split] = "Spend Actual" )
            ),
            1000000
        )
            < 1,
        DIVIDE (
            CALCULATE (
                SUM ( refv_Spend_Cap[Spend_2019] ),
                FILTER ( refv_Spend_Cap, refv_Spend_Cap[Ind_Monthend] = "x" )
            ),
            1000000
        )
            < 1
    ),
    DIVIDE (
        CALCULATE (
            SUM ( refv_Spend_Cap[Spend_2019] ),
            FILTER ( refv_Spend_Cap, refv_Spend_Cap[Split] = "Spend Forecast" )
        ),
        1000000
    ),
    ""
)

该公式正在计算以检查是否满足这两个条件:如果没有值,则填充预测,或者如果 ind monthend = 'x' 则应填充,如果不满足这两个条件则应将其留空。查询中没有语法错误,但我收到此错误:

True/False 表达式不指定列。用作表过滤器表达式的每个 True/False 表达式必须恰好引用一列

我哪里做错了?

标签: powerbidax

解决方案


这么长的公式很难理解。将它们分解为多个度量是最佳实践。例如,您的代码可以重写如下:

创建基础度量:

Total Spend = SUM ( refv_Spend_Cap[Spend_2019] ) / 1000000

现在重新使用基本度量来创建 3 个条件度量。此处无需使用 FILTER:

Spend Actual = CALCULATE ( [Total Spend], refv_Spend_Cap[Split] = "Spend Actual" )

Spend X = CALCULATE ( [Total Spend], refv_Spend_Cap[Ind_Monthend] = "x" )

Spend Forecast = CALCULATE ( [Total Spend], refv_Spend_Cap[Split] = "Spend Forecast" )

那么最终的结果很简单:

Forecast = IF ( [Spend Actual] < 1 || [Spend X] < 1, [Spend Forecast], "")

很容易理解正在发生的事情,也更容易调试。您还将获得性能奖励,因为(通常)重复使用的度量只被缓存和计算一次。

试试这个代码,如果它仍然给你带来问题,描述新的错误,我会帮你修复它。

顺便说一句,有一个流行的免费工具可以格式化您的 DAX 代码: Dax Formatter


推荐阅读