You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI中按项目分组聚合预算与任务的DAX实现问题

Power BI DAX多层级任务预算聚合错误问题解决

问题背景

现有vProject表包含多项目及多层级任务,需计算各任务的成本金额。设计的各层级成本汇总应等于预算总和,但聚合任务名称时预算汇总结果不正确。

输入数据示例

projettache niv1budget tache niv1tache niv2budget tache niv2tache niv3budget tache niv3budget total
1a50b25c25300 $
1a50a50
1a30a20a50
2a20x65y15200 $
2g15g25g60

现有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

问题根源

  1. SELECTEDVALUE的误用:该函数仅在上下文仅有单个值时返回正确结果,当遍历vProject多行数据时,无法获取每行对应的百分比,导致预算计算错误。
  2. 冗余的聚合逻辑:SUMMARIZE嵌套SUMX(FILTER(...))的写法不仅冗余,还可能因上下文冲突引入计算偏差。
  3. 未生效的年份过滤:定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:25:10