尝试了解 DAX 中的 CALCULATE 和 FILTER

Trying to Understand CALCULATE and FILTER in DAX

我正在尝试使用 FILTER 和 CALCULATE DAX 表达式。我想找出产品价格低于类别平均成本的不同订单的数量:自行车。 首先,我创建了一个 Measure 来计算自行车的平均成本,即 913.61

avg product cost bikes =
CALCULATE (
    AVERAGE ( AW_Product_DIM[ProductCost] ),
    AW_Product_Categories_DIM[CategoryName] = "Bikes"
)

接下来,我将创建一个度量来计算总订单数。

Total Orders =
DISTINCTCOUNT ( AW_Sales[OrderNumber] )

接下来,我有一个带有 FILTER 的 CALCULATE 函数来计算订单总数,其中的产品成本低于所有产品的平均成本 913.61。

Sales less than Bike's avg =
CALCULATE (
    [Total Orders],
    FILTER (
        AW_Product_DIM,
        AW_Product_DIM[ProductCost] < [avg product cost bikes]
    )
)

你能帮我理解为什么我在“销售额低于自行车的平均”列中没有得到任何值吗?配件和服装类别中的所有产品都低于自行车的平均成本 913.61。所以应该有 16983 的销售额低于 Bike 的平均配饰和 6976 的服装。所有的自行车都超过1000辆,所以那应该是空的。

请参考

其中包含我正在尝试可视化的矩阵视图。

度量是在调用它的上下文中计算的。当您在 FILTER(或任何迭代器函数)内部调用度量时,它是 calculated within the row context of the table you are iterating through 并且每一行可以是不同的值。

解决这个问题的一种方法是在 FILTER 之外计算它一次,然后为 FILTER 迭代的每一行重复使用该值,如下所示:

Sales less than Bike's avg =
VAR AvgBikeCost = [avg product cost bikes]
RETURN
    CALCULATE (
        [Total Orders],
        FILTER (
            AW_Product_DIM,
            AW_Product_DIM[ProductCost] < AvgBikeCost
        )
    )