powerbi - 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 的单个标量值并将其与表格视觉对象中的适当颜色匹配就好了。
对于计算类别总数的任何进一步见解,我将不胜感激。
解决方案
这是预期的行为。
Power BI 表将包含表中任何度量值未计算为的每一行BLANK()
。
ALLEXCEPT
停止id
和size
列中的值在计算时影响过滤器上下文[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 中的表上添加过滤器。
推荐阅读
- node.js - 找不到模块“aproba”
- python - 在 Pycharm 中关闭 matplotlib 图
- android - 如何仅针对 TabLayout 中的特定片段停止活动的旋转?
- angular - ngAfterViewInit 与 ngAfterContentChecked
- azure - 无法将实体添加到 Cosmos DB - 表
- tomcat - Tomcat初始化期间的Java NumberFormatException
- wpf - 如何将以下 xaml 语句转换为代码?
- angular - 如何将平铺层从 OpenStreetMap 更改为 Stamen
- c# - 使用 Selenium 在 textArea 中输入完整的 html
- php - 如何使用 php 将 2 个以上的数组插入 mysql 数据库