首页 > 解决方案 > 在 SUMX 和 CALCULATE 中使用 ALL 有什么区别?

问题描述

在此示例中(计算类别销售额与总销售额的比率):https ://docs.microsoft.com/en-us/dax/all-function-dax#example-1

公式为:

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / SUMX(
        ALL( ResellerSales_USD ),
        ResellerSales_USD[SalesAmount_USD]
    )

在此示例中(计算本年度产品销售额与总销售额的比率):https ://docs.microsoft.com/en-us/dax/all-function-dax#example-2

公式为:

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / CALCULATE(
        SUM( ResellerSales_USD[SalesAmount_USD] ),
        ALL( DateTime[CalendarYear] )
    )

在第二个示例中,为什么我们不能使用类似于示例 1 的 SUMX ALL 来删除日历年过滤器?例子:

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / SUMX(
        ALL( DateTime[CalendarYear] ),
        ResellerSales_USD[SalesAmount_USD]
    )

同样,可以使用 CALCULATE 将第一个示例重写为:

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / CALCULATE(
        SUM( ResellerSales_USD[SalesAmount_USD] ),
        ALL( ResellerSales_USD )
    )

标签: powerbidax

解决方案


编码

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / SUMX(
        ALL( DateTime[CalendarYear] ),
        ResellerSales_USD[SalesAmount_USD]
    )

将不起作用,因为捐赠者处的 SUMX 正在迭代列 DateTime[CalendarYear],因此不存在使 ResellerSales_USD[SalesAmount_USD] 列可访问的行上下文。此外,Date 和 ResellerSales 之间的关系是一对多的,不可能使用 RELATED,但需要 RELATEDTABLE 和聚合器,例如

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / SUMX(
        ALL( DateTime[CalendarYear] ),
        SUMX( RELATEDTABLE(ResellerSales_USD), ResellerSales_USD[SalesAmount_USD])
    )

而这个等效于第一个示例

=
SUMX(
    ResellerSales_USD,
    ResellerSales_USD[SalesAmount_USD]
)
    / CALCULATE(
        SUM( ResellerSales_USD[SalesAmount_USD] ),
        ALL( ResellerSales_USD )
    )

推荐阅读