如何在SSRS报表矩阵中按列值正确计算基准工时(Base Work Hours)总和
解决矩阵报表基准工时总计错误的问题
问题核心:矩阵总计行的基准工时没有按单个员工的基准工时求和,而是用日期区间的工作日天数乘以所有员工日工时的总和(笛卡尔积逻辑),导致结果错误。
解决方案1:从SQL层面提前计算单个员工基准工时
修改SQL查询,直接算出每个员工在指定区间的基准工时,返回明细数据给报表,让矩阵自动对明细求和:
SELECT EmplID, EmplName, -- 计算单员工基准工时:工作日天数 × 日工时 (DATEDIFF(DAY, @dtStartDate, @dtEndDate) + 1 - DATEDIFF(WEEK, @dtStartDate, @dtEndDate) * 2 - CASE WHEN DATEPART(WEEKDAY, @dtStartDate) IN (1,7) THEN 1 ELSE 0 END - CASE WHEN DATEPART(WEEKDAY, @dtEndDate) IN (1,7) THEN 1 ELSE 0 END ) * WorkHoursDay AS BaseWorkHours, ActualWorkHours -- 替换为实际工时对应的字段名 FROM tblEmpl
之后在矩阵控件中,将基准工时列绑定到BaseWorkHours字段,总计行默认会自动对该字段求和,得到正确的总计值(比如示例中的400)。
解决方案2:在报表矩阵中调整表达式聚合逻辑
如果无法修改SQL,直接在报表的基准工时单元格表达式中,用求和函数包裹单个员工的计算逻辑,强制总计行对每个员工的基准工时求和:
以SSRS为例,表达式写法如下:
=Sum( (DATEDIFF("d", Parameters!dtStartDate.Value, Parameters!dtEndDate.Value) + 1 - DATEDIFF("ww", Parameters!dtStartDate.Value, Parameters!dtEndDate.Value) * 2 - IIF(DatePart("w", Parameters!dtStartDate.Value) IN (1,7), 1, 0) - IIF(DatePart("w", Parameters!dtEndDate.Value) IN (1,7), 1, 0) ) * Fields!WorkHoursDay.Value )
这样就能避免总计行重复计算整体工作日天数,转而对每个员工的基准工时进行求和。
额外检查点
确保矩阵的行分组是按员工维度(比如员工ID、姓名)设置,没有错误的多维度分组导致数据重复或笛卡尔积。
内容的提问来源于stack exchange,提问作者Yulia
相关产品推荐
相关产品推荐

