DAX Studio 中的 YTD Measure 不显示多个日期的任何值

YTD Measure in DAX Studio doesn't show any value for several dates

尝试根据 https://www.daxpatterns.com/time-patterns/ 指南

在 DAX STUDIO 中计算多个日期的 YTD

我在我的模型中创建了一个度量,当我使用 Date Dimension 并为每个日期计算 YTD 时它完成了工作

CALCULATE (
    [Sales Amt],
    FILTER (
        ALL ( 'Date' ),
        'Date'[Year] = MAX ( 'Date'[Year] )
            && 'Date'[Date] <= MAX ( 'Date'[Date] )
    )
)

但是当我尝试使用 DAX Studio 重现相同的结果时,只有当我过滤特定日期的 CALCULATETABLE 时我才能得到正确的结果

此代码完美运行:

EVALUATE
CALCULATETABLE(
                ADDCOLUMNS (
                    VALUES ( 'Date'[Date] ),
                    "YTD", CALCULATE (
                        [Sales Amt],
                        FILTER (
                            ALL ( 'Date' ),
                            'Date'[Year] = MAX ( 'Date'[Year] )
                                && 'Date'[Date] <= MAX ( 'Date'[Date]  )
                        )
                    )
                )
,
'Date'[Date] = DATE(2018,5,1)
)

对于行中的每个日期,此代码预计 return YTD,但不幸的是它没有。我做错了什么?:

EVALUATE
CALCULATETABLE(
                ADDCOLUMNS (
                    VALUES ( 'Date'[Date] ),
                    "YTD", CALCULATE (
                        [Sales Amt],
                        FILTER (
                            ALL ( 'Date' ),
                            'Date'[Year] = MAX ( 'Date'[Year] )
                                && 'Date'[Date] <= MAX ( 'Date'[Date]  )
                        )
                    )
                )
,
'Date'[Date] >= DATE(2018,5,1)
)

唯一的区别是 =>=,但我得到所有行的空结果

您定义度量的方式没有问题。

但是,在测试度量值时,您应该尝试以类似于 Power BI 等客户端工具的方式编写 DAX 查询:

EVALUATE
SUMMARIZECOLUMNS(
    'Date'[Date],
    FILTER('Date', 'Date'[Date] >= DATE(2018,5,1)),
    "YTD", CALCULATE (
        [Sales Amt],
        FILTER (
            ALL ( 'Date' ),
            'Date'[Year] = MAX ( 'Date'[Year] )
                && 'Date'[Date] <= MAX ( 'Date'[Date]  )
        )
    )
)

甚至更好:

DEFINE MEASURE 'Sales'[Sales Amt YTD] = CALCULATE (
        [Sales Amt],
        FILTER (
            ALL ( 'Date' ),
            'Date'[Year] = MAX ( 'Date'[Year] )
                && 'Date'[Date] <= MAX ( 'Date'[Date]  )
        )
    )

EVALUATE
SUMMARIZECOLUMNS(
    'Date'[Date],
    FILTER('Date', 'Date'[Date] >= DATE(2018,5,1)),
    "YTD", [Sales Amt YTD]
)

您使用 CALCULATETABLE 编写它的方式的问题在于,您在 'Date'[Date] 列上创建了一个外部过滤器上下文,其中包含从 2018-05-01 开始的所有日期。在 FILTER 语句中评估 YTD 逻辑时,MAX('Date'[Year]) 使用此过滤器上下文,因此 returns 整个 'Date' table 中最大的年份(例如 2025 ).

请记住,CALCULATE 函数仅在计算第一个参数时应用上下文转换(行上下文到过滤器上下文)。过滤器参数在原始过滤器上下文中计算。

如果你想坚持你的语法,你可以写一个额外的 CALCULATE 来强制上下文转换也适用于内部 CALCULATE 调用的第二个参数:

EVALUATE
CALCULATETABLE(
    ADDCOLUMNS (
        VALUES ( 'Date'[Date] ),
        "YTD", 
            CALCULATE(        // Additional CALCULATE to force context transition on filter arguments
                CALCULATE (
                [Sales Amt],
                FILTER (
                    ALL ( 'Date' ),
                    'Date'[Year] = MAX ( 'Date'[Year] )
                        && 'Date'[Date] <= MAX ( 'Date'[Date]  )
                )
            )
        )
    ),
    'Date'[Date] >= DATE(2018,5,1)
)

这与直接引用度量相同,因为引用度量总是进行隐式计算:

EVALUATE
CALCULATETABLE(
    ADDCOLUMNS (
        VALUES ( 'Date'[Date] ),
        "YTD", [Sales Amt YTD]
    ),
    'Date'[Date] >= DATE(2018,5,1)
)