首页 > 解决方案 > DAX ALLEXCEPT 按多维表的类别求和

问题描述

我想按类别计算总数。类别在维度表中。

这是示例文件: DAX ALLEXCEPT total by category.pbix

我有以下模型:

在此处输入图像描述

这些是我的预期结果。颜色总计:

在此处输入图像描述

我认为我可以通过以下措施达到预期的效果:

ALLEXCEPT_color =
CALCULATE (
    [Sales],
    ALLEXCEPT (
        FactTable, -- surprisingly 'dim1' table in that place gives wrong results
        dim1[Color]
    )
)

或者使用 Alberto Ferrari https://www.sqlbi.com/articles/using-allexcept-versus-all-and-values/建议的方法:

ALL_VALUES_color = 
    CALCULATE (
        [Sales],
        ALL (FactTable), -- again, 'dim1' produces wrong results, has to be FactTable
        VALUES ( dim1[Color] )
    )

这两种措施都有效并返回正确的结果。然而,它们将显示的结果相乘,使所有维度的笛卡尔积成为可能。为什么?如何预防?

我通过测量达到了预期的结果:

Expected_Results_Color =
IF (
    ISBLANK ( [Sales] ),
    BLANK (),
    [ALLEXCEPT_color]
)

在此处输入图像描述

可能我错过了一些关于ALLEXCEPT功能的东西,所以我没有得到我想要的第一枪。对多个表使用 ALLEXCEPT 函数背后的逻辑是什么,尤其是在远离星型模式中心的维度上。

使用什么模式?在这里,我找到了有希望的解决方案,如下所示:

ByCategories =
CALCULATE (
    SUM ( FactTable[Sales] ),
    ALLEXCEPT (
        dim1,
        dim1[Color]
    ),
    ALLEXCEPT (
        dim2,
        dim2[Size]
    ),
    ALLEXCEPT (
        dim3,
        dim3[Scent]
    )
)

但正如我在它不起作用之前测试过的那样。它不会按维度聚合 [Sales],而是按原样生成 [Sales]。

所以我发现这是正确的方向:

ByCategories =
CALCULATE (
    SUM ( FactTable[Sales] ),
    ALLEXCEPT (
        FactTable, -- here be difference
        dim1[Color],
        dim2[Size],
        dim3[Scent]
    )
)

我推测可能还有另一种方式。

Measure = 
    var MyTableVariable =
    ADDCOLUMNS (
        VALUES ( dim1[color] ),
        "GroupedSales", [Sales]
    )
    RETURN
        ...

如果我们能从 MyTableVariable 中检索 GroupedSales 的单个标量值并将其与表格视觉对象中的适当颜色匹配就好了。

对于计算类别总数的任何进一步见解,我将不胜感激。

标签: powerbidax

解决方案


这是预期的行为。

Power BI 表将包含表中任何度量值未计算为的每一行BLANK()

ALLEXCEPT停止idsize列中的值在计算时影响过滤器上下文[Sales],因此这两列的每个可能值都将给出相同的(非空白)结果(这会导致您看到的笛卡尔积)。

例如,在 (a, black, big) 行上,度量的筛选上下文包含:

FactTable[id] = {"a"}
dim1[color] = {"black"}
dim2[size] = {"big"}

然后在评估时从过滤器上下文中CALCULATE([Sales], ALLEXCEPT(...))删除FactTable[id]and 所以新的过滤器上下文就是:dim2[size][Sales]

dim1[color] = {"black"}

[Sales]在此过滤器上下文中不是BLANK(),因此该行包含在结果中。

解决此问题的正确方法是将结果包装在 中IF,就像您在Expected_Results_Color度量中所做的那样,或者[Sales] not Blank在 Power BI 中的表上添加过滤器。


推荐阅读