如何通过父/子项目ID在事实表中计算最大营收的DAX问题
问题描述
现有两张表:
- 维度表:存储父项目ID(Parent ID)与子项目ID(Sub ID)的关联关系
- 事实表:存储子项目对应的营收数据(Revenue)
需求:针对每个父项目ID,计算其下属所有子项目的营收最大值,并将该最大值填充到该父项目的每一行中,最终效果如下:
| Parent ID | Sub ID | Revenue | Max Revenue |
|---|---|---|---|
| 1 | 101 | 100 | 100 |
| 1 | 201 | 25 | 100 |
| 1 | 301 | 50 | 100 |
| 2 | 102 | 75 | 75 |
| 2 | 202 | 50 | 75 |
| 2 | 302 | 45 | 75 |
尝试过基于维度表父项目ID创建变量、使用MAXX函数按ID计算等方法,均未成功,寻求解决办法。
解决方案
一、DAX实现(Power BI/Excel Power Pivot)
确保维度表和事实表已通过Sub ID建立关联,创建计算列即可实现需求:
Max Revenue = CALCULATE( MAX('事实表'[Revenue]), ALLEXCEPT('维度表', '维度表'[Parent ID]) )
说明:
ALLEXCEPT('维度表', '维度表'[Parent ID]):保留当前行的Parent ID筛选条件,移除其他所有筛选,确保只计算当前父项目下所有子项目的营收MAX('事实表'[Revenue]):在筛选范围内取营收最大值
如果是父项目到子项目的一对多关联,也可以用MAXX结合RELATEDTABLE实现:
Max Revenue = MAXX( RELATEDTABLE('事实表'), '事实表'[Revenue] )
这个写法会自动匹配当前父项目对应的所有子项目营收,直接取最大值。
二、SQL实现
如果在数据库中处理,可通过分组聚合后关联原表的方式完成:
SELECT d.Parent_ID, d.Sub_ID, f.Revenue, agg.Max_Revenue FROM 维度表 d JOIN 事实表 f ON d.Sub_ID = f.Sub_ID JOIN ( SELECT d.Parent_ID, MAX(f.Revenue) AS Max_Revenue FROM 维度表 d JOIN 事实表 f ON d.Sub_ID = f.Sub_ID GROUP BY d.Parent_ID ) agg ON d.Parent_ID = agg.Parent_ID ORDER BY d.Parent_ID, d.Sub_ID;
说明:
- 子查询
agg先按Parent_ID分组,算出每个父项目下的营收最大值 - 将原维度表、事实表与子查询结果通过Parent_ID关联,把最大值填充到每一行
内容的提问来源于stack exchange,提问作者Befold
相关产品推荐
相关产品推荐

