Power BI中按项目分组聚合预算与任务的DAX实现问题
Power BI DAX多层级任务预算聚合错误问题解决
问题背景
现有vProject表包含多项目及多层级任务,需计算各任务的成本金额。设计的各层级成本汇总应等于预算总和,但聚合任务名称时预算汇总结果不正确。
输入数据示例
| projet | tache niv1 | budget tache niv1 | tache niv2 | budget tache niv2 | tache niv3 | budget tache niv3 | budget total |
|---|---|---|---|---|---|---|---|
| 1 | a | 50 | b | 25 | c | 25 | 300 $ |
| 1 | a | 50 | a | 50 | |||
| 1 | a | 30 | a | 20 | a | 50 | |
| 2 | a | 20 | x | 65 | y | 15 | 200 $ |
| 2 | g | 15 | g | 25 | g | 60 |
现有DAX代码
度量值
Budget_niv1 = [Budget prévu] * SELECTEDVALUE(vProject[PourcentageRépartitionniveau1]) Budget_niv2 = [Budget prévu] * SELECTEDVALUE(vProject[PourcentageRépartitionniveau2]) Budget_niv3 = [Budget prévu] * SELECTEDVALUE(vProject[PourcentageRépartitionniveau3])
新表查询
Budget level = var Year = SELECTEDVALUE(vTime[fYear]) VAR CombineTable = UNION( SELECTCOLUMNS(vProject, "niveau", vProject[Répartitionniveau1], "Budget", [Budget_niv1]), SELECTCOLUMNS(vProject, "niveau", vProject[Répartitionniveau2], "Budget", [Budget_niv2]), SELECTCOLUMNS(vProject, "niveau", vProject[Répartitionniveau3], "Budget", [Budget_niv3]) ) VAR Resultat = SUMMARIZE( CombineTable, [niveau], "Budget Total", SUMX( FILTER(CombineTable, [niveau] = EARLIER([niveau])), [Budget])) RETURN Resultat
问题根源
SELECTEDVALUE的误用:该函数仅在上下文仅有单个值时返回正确结果,当遍历vProject多行数据时,无法获取每行对应的百分比,导致预算计算错误。- 冗余的聚合逻辑:
SUMMARIZE嵌套SUMX(FILTER(...))的写法不仅冗余,还可能因上下文冲突引入计算偏差。 - 未生效的年份过滤:定义的
Year变量未实际应用到数据过滤中,可能导致跨年份数据被错误聚合。
解决方案
1. 修正层级预算度量值
直接引用行上下文的百分比列,替代SELECTEDVALUE:
Budget_niv1 = [Budget prévu] * vProject[PourcentageRépartitionniveau1] Budget_niv2 = [Budget prévu] * vProject[PourcentageRépartitionniveau2] Budget_niv3 = [Budget prévu] * vProject[PourcentageRépartitionniveau3]
若
[Budget prévu]是列而非度量值,直接替换为vProject[Budget prévu]即可。
2. 优化新表查询逻辑
添加年份过滤、简化聚合逻辑,并过滤空层级数据:
Budget level = VAR SelectedYear = SELECTEDVALUE(vTime[fYear]) -- 过滤符合年份条件的项目数据(若无年份需求可删除此变量) VAR FilteredProjects = FILTER( vProject, ISBLANK(SelectedYear) || vProject[fYear] = SelectedYear ) -- 合并各层级数据,过滤空层级 VAR CombineTable = UNION( SELECTCOLUMNS( FILTER(FilteredProjects, NOT ISBLANK([Répartitionniveau1])), "niveau", [Répartitionniveau1], "Budget", [Budget_niv1] ), SELECTCOLUMNS( FILTER(FilteredProjects, NOT ISBLANK([Répartitionniveau2])), "niveau", [Répartitionniveau2], "Budget", [Budget_niv2] ), SELECTCOLUMNS( FILTER(FilteredProjects, NOT ISBLANK([Répartitionniveau3])), "niveau", [Répartitionniveau3], "Budget", [Budget_niv3] ) ) -- 按层级分组求和 VAR Resultat = GROUPBY( CombineTable, [niveau], "Budget Total", SUMX(CURRENTGROUP(), [Budget]) ) RETURN Resultat
3. 额外检查项
- 确认
Répartitionniveau1/2/3列的空值已被过滤,避免无效的空层级聚合。 - 验证
[Budget prévu]在单行上下文下的返回值是否正确,确保基础预算数据无误。
内容的提问来源于stack exchange,提问作者houssem eddine ayari
相关产品推荐
相关产品推荐

