基于切片器选择的动态重叠数据DAX迭代表平均值计算问题
DAX计算重叠年份-地点组合的标签平均值
表结构与需求
- Data表:包含列[Label](文本)、[Year](整数)、[Location](文本)、[Value](整数),每个Label对应多组年份、地点的数据。
- Label_List表:包含列[Label](文本,为Data表Label列的唯一值集合)。
需求:通过切片器选择Label_List中的Label后,在可视化表中针对每一行Label,计算仅与选中Label存在「Year+Location」组合重叠的Value子集的平均值,即示例中的「Label Average Overlap」列。
已实现的DAX代码(Selected Label Average Overlap)
Selected Label Average Overlap = CALCULATE( AVERAGE(Data[Value]), Data[Label] = SELECTEDVALUE(Label_List[Label]), Data[Year] IN VALUES(Data[Year]) && Data[Location] IN VALUES(Data[Location]) )
当前尝试的错误代码(Label Average Overlap)
Label Average Overlap = VAR SlicerLabel = SELECTEDVALUE(Label_List[Label]) VAR DataLabelRow = SELECTEDVALUE(Data[Label]) VAR CommonYearsAndLocations = CALCULATETABLE( VALUES(Data[Year]), FILTER( Data, COUNTROWS( FILTER(Data, Data[Year] = EARLIER(Data[Year]) && Data[Location] = EARLIER(Data[Location]) && Data[Label] = DataLabelRow) ) > 0 && COUNTROWS( FILTER(Data, Data[Year] = EARLIER(Data[Year]) && Data[Location] = EARLIER(Data[Location]) && Data[Parent] = SlicerLabel) ) > 0 ) ) RETURN CALCULATE( AVERAGE(Data[Value]), Data[Label] = SlicerLabel, Data[Year] IN CommonYearsAndLocations, Data[Location] IN VALUES(Data[Location]) )
示例数据
Label_List表
| Label |
|---|
| A |
| B |
| C |
| D |
| E |
| F |
Data表
| Label | Year | Location | Value |
|---|---|---|---|
| A | 2022 | LocationA | 100 |
| A | 2023 | LocationA | 103 |
| A | 2024 | LocationA | 105 |
| A | 2024 | LocationB | 95 |
| A | 2025 | LocationA | 110 |
| B | 2021 | LocationB | 90 |
| B | 2023 | LocationB | 91 |
| B | 2024 | LocationA | 92 |
| B | 2025 | LocationA | 94 |
| B | 2025 | LocationB | 93 |
| C | 2021 | LocationA | 87 |
| C | 2023 | LocationB | 89 |
| C | 2024 | LocationA | 85 |
| D | 2021 | LocationA | 100 |
| D | 2022 | LocationA | 100 |
| D | 2023 | LocationA | 104 |
| E | 2023 | LocationB | 110 |
| E | 2024 | LocationB | 112 |
| E | 2025 | LocationB | 109 |
| F | 2021 | LocationA | 99 |
| F | 2022 | LocationA | 98 |
| F | 2022 | LocationB | 95 |
| F | 2023 | LocationA | 97 |
| F | 2024 | LocationB | 98 |
预期可视化结果(切片器选中Label A时)
| Label | Label Average | Label Average Overlap | Selected Label Average | Selected Label Average Overlap |
|---|---|---|---|---|
| A | 102.6 | 102.6 | 102.6 | 102.6 |
| B | 92 | 93 | 102.6 | 107.5 |
| C | 87 | 85 | 102.6 | 105 |
| D | 101.33 | 102 | 102.6 | 101.5 |
| E | 110.33 | 112 | 102.6 | 95 |
| F | 97.4 | 97.67 | 102.6 | 99.33 |
问题修正与正确DAX代码
当前代码的核心问题:
- 仅提取了Year,未保留「Year+Location」的组合逻辑——重叠是两者的组合,不是单独年份。
- 误写了
Data[Parent],应为Data[Label]。 - 最终筛选逻辑错误,未针对当前行Label筛选重叠组合的数据。
正确代码:
Label Average Overlap = VAR SlicerLabel = SELECTEDVALUE(Label_List[Label]) VAR CurrentLabel = SELECTEDVALUE(Data[Label]) // 获取选中Label的所有Year+Location组合 VAR SlicerCombos = CALCULATETABLE( SUMMARIZE(Data, Data[Year], Data[Location]), Data[Label] = SlicerLabel ) // 计算当前Label与选中Label的重叠Year+Location组合 VAR OverlapCombos = INTERSECT( SUMMARIZE(Data, Data[Year], Data[Location]), SlicerCombos ) RETURN CALCULATE( AVERAGE(Data[Value]), TREATAS(OverlapCombos, Data[Year], Data[Location]), Data[Label] = CurrentLabel )
代码说明
SlicerCombos:筛选切片器选中Label对应的所有(年份,地点)组合。OverlapCombos:通过INTERSECT获取当前行Label与选中Label的重叠组合。TREATAS将重叠组合作为筛选条件,计算当前行Label在这些组合下的Value平均值。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

