在DAX中另一个CALCULATE函数内的CALCULATE行为

时间:2018-04-25 15:51:51

标签: dax

鉴于这两项措施:

Measure1 = CALCULATE(CALCULATE(SUM([column]); Filter 1; Filter 2 ); Filter 3; Filter 4 ) 
Measure2 = CALCULATE(SUM([column]); Filter 1; Filter 2; Filter 3; Filter 4 )

为什么我会得到不同的结果?

2 个答案:

答案 0 :(得分:1)

对于未来的读者,我想在这里提出一个非链接的答案。

Marco Russo在文章中解释道 Order of Evaluation in CALCULATE Parameters, 在Measure1中,首先评估外部过滤器Filter 3Filter 4,而在Measure2中并行评估所有过滤器(并使用AND逻辑进行组合) )。

如果其中一个过滤器Filter 1Filter 2删除Filter 3Filter 4指定的任何过滤器上下文(例如,使用ALL()之类的函数),那么你得到的结果与并行评估所有过滤器的结果不同。

Marco Russo给出的例子如下:

CALCULATE(
    CALCULATE(
        [MEASURE],
        CUSTOMER[COUNTRY] = "ITALY"
    ),
    ALL( CUSTOMER[COUNTRY] )
)

CALCULATE(
    CALCULATE(
        [MEASURE],
        ALL( CUSTOMER[COUNTRY] )
    ),
    CUSTOMER[COUNTRY] = "ITALY"
)

在第一个中,我们只过滤到ITALY行,就像外部过滤器不存在一样。在第二个中,ALL()函数剥离外部过滤器,因为它在之后被评估,并且您获得与所有国家/地区对应的行。

答案 1 :(得分:0)

我刚刚在Marco Russo撰写的这篇文章中找到了答案https://www.sqlbi.com/articles/order-of-evaluation-in-calculate-parameters/