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

基于SQL实现同一日期多地点工作时长按1/地点数计算的需求

调整SQL查询实现按日期地点均分Worktime

我来帮你修改这个SQL查询,满足同一日期多地点工作时,将Worktime按当日地点数量均分的需求。核心思路是先统计每个员工每天的不同工作地点数,再用1除以这个数值得到每个地点对应的Worktime。

修改后的完整SQL

SELECT DISTINCT 
    F_Emp_code,
    CONVERT(varchar, t.F_Log_dtPunched, 103) AS F_Tbl_dtpunched,
    Loc.F_Loc_code,
    -- 计算1除以当日该员工的不同地点数量,用1.0确保浮点数结果
    1.0 / COUNT(DISTINCT Loc.F_Loc_code) OVER (PARTITION BY F_Emp_code, CONVERT(varchar, t.F_Log_dtPunched, 103)) AS Worked
FROM (
    SELECT *, row_number() over (partition by F_Emp_code order by F_Emp_code) as rn 
    FROM T_Mst_Employee 
) A 
LEFT JOIN T_Mst_Company co ON co.F_Com_code = A.F_Emp_Company_ID 
RIGHT JOIN T_Tra_Loginfo t ON t.F_Log_Emp_Code = A.F_Emp_code 
JOIN dbo.T_Mst_terminalinfo TF ON TF.F_Ter_nTerminalID = t.F_Log_TerminalID 
LEFT JOIN T_Mst_Location Loc ON Loc.F_Loc_code = TF.F_Ter_LocCode 
WHERE 
    A.F_Emp_Status = 'Active' 
    AND F_Emp_code='100229' 
    AND t.F_Log_dtPunched between '2017-01-01' and '2017-01-08'
GROUP BY 
    co.F_Com_Logo, A.f_emp_firstname,A.F_Emp_MiddleName, A.F_Emp_LastName,
    F_Emp_code, t.F_Log_dtPunched,co.F_Com_Desc,Loc.F_Loc_code,Loc.F_Loc_Desc,TF.F_Ter_nTerminalID

关键修改说明

  • 替换原查询中COUNT(TF.F_Ter_LocCode)为窗口函数计算:
    • COUNT(DISTINCT Loc.F_Loc_code) OVER (PARTITION BY F_Emp_code, CONVERT(varchar, t.F_Log_dtPunched, 103)):按员工ID和格式化后的日期分组,统计该员工当日的不同工作地点数量
    • 1.0确保除法结果为浮点数,避免整数除法导致结果被截断为0
  • 保留了原查询的关联逻辑、筛选条件和分组规则,保证其他业务逻辑不受影响

效果验证

针对你提供的示例数据,修改后的查询会输出如下结果:

empiddateloccodeworktime
10022901/01/2017051381.0
10022902/01/2017051381.0
10022903/01/2017051381.0
10022905/01/2017094091.0
10022906/01/2017051381.0
10022907/01/2017013050.5
10022907/01/2017051380.5

完美实现了“同一日期不同地点时,Worktime为1除以当日地点数量”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:52:24