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也未包含费用计算。
问题根源
- 命名笔误:多处表名/度量名与实际数据源不匹配——比如
TimeTracking应为TimeRecord,WorkingRatio是前面定义的TimeRatio,Clockify大概率是TimeRecord的笔误,Salary对应EmployeeSalary,Expense对应InternalExpense,这些不一致会导致上下文计算异常。 - 无工时项目的分摊空白:筛选月份内部分项目无工时记录时,
TimeRatio返回空白,进而ProjectExpense = [ALLExpense] * 空白结果为空;但总计行忽略单个项目上下文,TimeRatio的分子分母均为筛选周期内总工时,结果为1,因此ProjectExpense等于ALLExpense,总计正确。 - 总成本未处理空白值:当
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
相关产品推荐
相关产品推荐

