DAX 聚合和动态过滤器

DAX Aggregation and dynamic filter

我正在尝试计算响应切片器选择(第 2 级)的聚合数据(第 1 级)

具体示例:

数据

Level1  Level2  Level3 Data
A         z       q      1
A         zz      q      2
A         zzz     r      3
A         zzzz    r      4
B         z       q      10
B         zz      q      20
B         zzz     r      30
B         zzzz    r      40

按 Level1 聚合数据

选项 1。 使用 GroupBy 创建 table 并使用 Level1 加入它(在关系选项卡中)

Table1_agg =
GROUPBY(
   Table1,
   Table1[Level1],
   "AggL1_Data",sumx(CURRENTGROUP(),Table1[Data])
)

选项 2. 在表 1 中使用过滤器

AggL1_Filter = 
    Calculate(
    sum(Table1[Data]),
    FILTER(
        Table1,
        Table1[Level1]= EARLIER(Table1[Level1])
        )
)  

结果 - 聚合有效

但是,使用 Level2 切片器进行过滤不起作用。

聚合数据 "AggL1_" 仍然显示 10 和 100,而我希望看到 5(对于 A)和 50(对于 B)

非常感谢您的帮助,我已经坚持了很长时间,

提前致谢,

dusiod

我想你只需要使用 ALLSELECTED function.

AggMeasure = CALCULATE(SUM(Table1[Data]), ALLSELECTED(Table1[Level2]))


编辑: 如果您只需要按 Level1 分组(忽略其他可能级别的筛选上下文),则需要进行调整。

AggMeasure = CALCULATE(SUM(Table1[Data]),
                 FILTER(ALLSELECTED(Table1),
                     Table1[Level1] IN VALUES(Table1[Level1])))

这像以前一样使用 ALLSELECTED 函数来保留切片器选择,但添加了一个条件,即我们只考虑与当前 Level1 匹配的行。对于 A 行中的任何内容,VALUES(Table1[Level1]) 仅 returns A 因为这就是它在其过滤器上下文中看到的全部内容。 (总计行删除了所有筛选器上下文,因此 returns 两者的总和。)

您可以使用 = MAX(...)= MIN(...)= LASTNONBLANK(...).

而不是 IN VALUES(...)

我想这就解决了,

0Measure = 
CALCULATE(
    SUM(Table1[Data]),
    FILTER(ALLSELECTED(Table1),Table1[Level1]=MAX(Table1[Level1]))
)

但是谁能解释为什么 FILTER 条件有效

Table1[Level1]=MAX(Table1[Level1])

特别是 MAX 的文档指出该函数忽略逻辑值和文本...