我想按类别计算总数。类别在维度表中。
这是示例文件: 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函数用于多个表,尤其是尺寸远于星形模式中心的表,背后的逻辑是什么。
使用哪种模式? 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的单个标量值,并将其与表格视觉中的适当颜色进行匹配。
对于在计算类别总数中的任何进一步见解,我将不胜感激。
答案 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。