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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:31:05