基于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
- 保留了原查询的关联逻辑、筛选条件和分组规则,保证其他业务逻辑不受影响
效果验证
针对你提供的示例数据,修改后的查询会输出如下结果:
| empid | date | loccode | worktime |
|---|---|---|---|
| 100229 | 01/01/2017 | 05138 | 1.0 |
| 100229 | 02/01/2017 | 05138 | 1.0 |
| 100229 | 03/01/2017 | 05138 | 1.0 |
| 100229 | 05/01/2017 | 09409 | 1.0 |
| 100229 | 06/01/2017 | 05138 | 1.0 |
| 100229 | 07/01/2017 | 01305 | 0.5 |
| 100229 | 07/01/2017 | 05138 | 0.5 |
完美实现了“同一日期不同地点时,Worktime为1除以当日地点数量”的需求。
内容的提问来源于stack exchange,提问作者user3262364
相关产品推荐
相关产品推荐

