Powerbi DAX ALLEEXCEPT按多维表的类别求和

Powerbi DAX ALLEEXCEPT按多维表的类别求和,powerbi,dax,Powerbi,Dax,我想按类别计算总数。该类别位于维度表中 以下是示例文件: 我有以下型号: 这是我预期的结果。按颜色列出的总数: 我认为通过以下措施可以达到预期的效果: ALLEXCEPT_color = CALCULATE ( [Sales], ALLEXCEPT ( FactTable, -- surprisingly 'dim1' table in that place gives wrong results dim1[Color] ) ) 或

我想按类别计算总数。该类别位于维度表中

以下是示例文件:

我有以下型号:

这是我预期的结果。按颜色列出的总数:

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

ALLEXCEPT_color =
CALCULATE (
    [Sales],
    ALLEXCEPT (
        FactTable, -- surprisingly 'dim1' table in that place gives wrong results
        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]
    )
)
但正如我之前测试的那样,它不起作用。它不按维度聚合[销售],而是按维度生成[销售]

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

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的单个标量值,并将其与VisualTable中的适当颜色匹配,那个该多好


我将非常感谢在计算类别总数方面的任何进一步见解。

这是预期行为

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

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

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

FactTable[id] = {"a"}
dim1[color] = {"black"}
dim2[size] = {"big"}
然后
CALCULATE([Sales],ALLEXCEPT(…)
在评估
[Sales]
时从过滤器上下文中删除
FactTable[id]
dim2[size]
;因此,新的过滤器上下文只是:

dim1[color] = {"black"}
此筛选器上下文中的
[Sales]
不是
BLANK()
,因此该行包含在结果中


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

我建议更改您的数据模型。创建dim“Color”,dim“Size”,并在事实表中具有相应的ID。在维度之间共享同一id毫无意义。@RADO当然你的评论是正确的。然而ALLEXCEPT进行交叉连接。我已经更新了我的示例并上传了新的pbix文件;但是,您可能还需要做一件事。这些a、b、c等ID是什么?它们是什么意思?在我看来,它们也必须是一个维度(在事实表中具有相应的id)。然后,在矩阵中,您应该从维度使用这些a、b、c等,而不是从fact@RADO我来检查一下。使用多个表和ALLEXCEPT有什么规则吗?其实这是我问题的根源。我应该如何在多维上使用ALLEXCEPT创建group by?我应该从事实表开始吗
ALLEXCEPT(FactTable,dim1[color],dim2[size])
或者我应该让
计算([Sales],ALLEXCEPT(dim1,color),ALLEXCEPT(dim2,size))
dim1[color] = {"black"}