DAX ALLEXCEPT按多维表的类别求和

时间:2019-11-21 15:28:02

标签: powerbi dax

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

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

我有以下模型:

enter image description here

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

enter image description here

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

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]
)

enter image description here

可能我缺少关于ALLEXCEPT函数的某些信息,所以我没有得到想要的第一张照片。将ALLEXCEPT函数用于多个表,尤其是尺寸远于星形模式中心的表,背后的逻辑是什么。

使用哪种模式? Here我找到了很有前途的解决方案,如下所示:

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的单个标量值,并将其与表格视觉中的适当颜色进行匹配。

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

1 个答案:

答案 0 :(得分:0)

这是预期的行为。

Power BI表将包括表中任何度量均不等于BLANK()的每一行。

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

例如,在(a,黑色,大)行上,度量的过滤器上下文包含:

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

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

dim1[color] = {"black"}

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

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