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

PowerBI矩阵总计正确但部分月份行数据缺失问题求助

问题排查与修复方案

问题还原

基于TimeRecord、EmployeeSalary、InternalExpense三张Excel表及日期表创建矩阵表,表间已建立ID与日期关联,通过以下DAX度量值按项目分摊员工薪资及内部费用计算项目总成本:

1. TimeRatio = DIVIDE(
                       SUM('TimeRecord'[Time]),
                       CALCULATE(SUM('TimeRecord'[Time]),
                                ALL('TimeTracking'[Project])
                                )
                          )
2. SalaryXWorkRatio = ([WorkingRatio]*SELECTEDVALUE(Salary[Salary]))
3. ALLExpense = SUM(Expense[Cost])
4. ProjectExpense = [AllExpense]*[WorkingRatio]
5. SumSalaryWorkRatio = SUMX(VALUES(Clockify[Project]),
       CALCULATE(SUMX(VALUES(Clockify[Code]),[SalaryXWorkRatio])))
6. ProjectTotalCost = [SumSalaryWorkRatio]+[ProjectExpense]

筛选1、3、5、8、10月时,Expense列的项目行无数据但总计正确,ProjectTotalCost也未包含费用计算。

问题根源

  1. 命名笔误:多处表名/度量名与实际数据源不匹配——比如TimeTracking应为TimeRecord,WorkingRatio是前面定义的TimeRatio,Clockify大概率是TimeRecord的笔误,Salary对应EmployeeSalary,Expense对应InternalExpense,这些不一致会导致上下文计算异常。
  2. 无工时项目的分摊空白:筛选月份内部分项目无工时记录时,TimeRatio返回空白,进而ProjectExpense = [ALLExpense] * 空白结果为空;但总计行忽略单个项目上下文,TimeRatio的分子分母均为筛选周期内总工时,结果为1,因此ProjectExpense等于ALLExpense,总计正确。
  3. 总成本未处理空白值:当SumSalaryWorkRatio或ProjectExpense为空时,直接相加会导致结果为空,而非0加对应有效值。

修复步骤

1. 修正命名错误

先统一所有表名、度量名与实际数据源匹配,修正后的TimeRatio:

TimeRatio = DIVIDE(
    SUM('TimeRecord'[Time]),
    CALCULATE(SUM('TimeRecord'[Time]), ALL('TimeRecord'[Project]))
)

2. 处理无工时项目的分摊逻辑

如果需要给无工时项目按合理比例分摊费用(比如该项目全年工时占比),修改TimeRatio为:

TimeRatio = 
VAR CurrentProj = SELECTEDVALUE('TimeRecord'[Project])
-- 该项目全年总工时
VAR ProjYearTotal = CALCULATE(SUM('TimeRecord'[Time]), ALL('DateTable'), 'TimeRecord'[Project] = CurrentProj)
-- 筛选周期内总工时
VAR PeriodTotal = CALCULATE(SUM('TimeRecord'[Time]), ALL('TimeRecord'[Project]))
-- 筛选周期内该项目工时
VAR ProjPeriod = SUM('TimeRecord'[Time])
RETURN
IF(
    NOT ISBLANK(PeriodTotal),
    DIVIDE(
        -- 无工时则按全年占比计算等效工时,否则用实际工时
        COALESCE(ProjPeriod, (ProjYearTotal / CALCULATE(SUM('TimeRecord'[Time]), ALL('DateTable'))) * PeriodTotal),
        PeriodTotal
    ),
    0
)

若无需给无工时项目分摊费用,仅需将空值转为0,直接用COALESCE([TimeRatio], 0)替代原TimeRatio即可。

3. 修正其他关联度量值

-- 薪资分摊
SalaryXWorkRatio = [TimeRatio] * SELECTEDVALUE('EmployeeSalary'[Salary])

-- 确保费用仅统计筛选月份数据
ALLExpense = SUM('InternalExpense'[Cost])

-- 项目费用分摊
ProjectExpense = [ALLExpense] * [TimeRatio]

-- 薪资汇总
SumSalaryWorkRatio = SUMX(
    VALUES('TimeRecord'[Project]),
    CALCULATE(SUMX(VALUES('EmployeeSalary'[Code]), [SalaryXWorkRatio]))
)

-- 总成本:用COALESCE处理空白值,避免结果为空
ProjectTotalCost = COALESCE([SumSalaryWorkRatio], 0) + COALESCE([ProjectExpense], 0)

4. 检查表关系

确认InternalExpense表与日期表通过日期字段正确关联,确保筛选月份时ALLExpense仅统计对应月份的费用,而非全年数据。


内容的提问来源于stack exchange,提问作者Febb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:08:10