【问题标题】:Summing Hours Worked Based On Two Unique Identifiers基于两个唯一标识符的工作时间总和
【发布时间】:2020-02-21 06:31:35
【问题描述】:

我想总结公司员工在给定两周时间段(工资期)内的总工作时间。我有一个视图,它为唯一的员工标识符 [CODE_USER] 拉出一列,为唯一标识的薪酬类型(常规、加班、假期、假期等)[代码]、总工作时间 [小时] 和工作周 [Day] 中每一天的列。

就目前而言,[小时数] 列显示每位独特员工每天的总工作时间(基于独特的薪酬类型,例如正常工作时间或加班时间)。

我需要将每个员工 [CODE_USER]、每种薪酬类型 [CODE] 在两周内的所有工作时间合并到一个名为“小时”的汇总列中。

假设员工 ID 在两周内正常工作 80 小时,加班时间为 20 小时(E1 等于正常时间,E2 等于加班时间),理想的最终结果如下所示:

CODE_USER   Code    Hours   
  125       E1       80.00  
  125       E2       20.00

我认为我最接近解决它的是以下代码,但是它不会在两周内为唯一的 CODE_USER 工作的总小时数,它将两周内每天的工作小时数列为该员工的行集合。例如,下面的代码显示员工 ID 125 的 18 行,员工在 E1(常规)标记的时间段内工作了 10 个完整的 8.00 小时天,并且员工在 E2 标记的时间段(加班)中有 8 次加班时间)。

代码:

SELECT [CODE_USER], 
   [Code],
   SUM(Hours) AS Hours,
   [Day]
FROM [LookUp].[dbo].[Daily_Hours_Worked]
WHERE [Day] >= '20191007' AND [Day] < '20191019'
AND [CODE_USER] LIKE '%125%'
GROUP BY [CODE_USER], [Code], [Hours], [Day]
ORDER BY [CODE_USER], [Day] DESC;

结果:

CODE_USER   Code    Hours   Day
  125       E1       8.00   2019-10-18 00:00:00.000
  125       E2       0.70   2019-10-18 00:00:00.000
  125       E1       8.00   2019-10-17 00:00:00.000
  125       E2       1.65   2019-10-17 00:00:00.000
  125       E1       8.00   2019-10-16 00:00:00.000
  125       E2       1.15   2019-10-16 00:00:00.000
  125       E1       8.00   2019-10-15 00:00:00.000
  125       E2       0.97   2019-10-15 00:00:00.000
  125       E1       8.00   2019-10-14 00:00:00.000
  125       E2       1.99   2019-10-14 00:00:00.000
  125       E1       8.00   2019-10-11 00:00:00.000
  125       E2       0.12   2019-10-11 00:00:00.000
  125       E1       8.00   2019-10-10 00:00:00.000
  125       E2       0.05   2019-10-10 00:00:00.000
  125       E1       8.00   2019-10-09 00:00:00.000
  125       E2       0.10   2019-10-09 00:00:00.000
  125       E1       7.99   2019-10-08 00:00:00.000
  125       E1       7.99   2019-10-07 00:00:00.000

预期结果:

我想查看表中每个唯一员工 ID [CODE_USER] 的输入支付周期(2 周周期)的 E1、E2 等的总和。最终结果应该是每个员工的两行,其中包含正常时间 (E1) 和加班 (E2) 的员工在给定时间段内为每个类别工作的小时数。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    难道不应该简单地从分组中删除日期并从 where 子句中删除特定员工吗?

    SELECT [CODE_USER], 
       [Code],
       SUM(Hours) AS Hours
    FROM [LookUp].[dbo].[Daily_Hours_Worked]
    WHERE [Day] >= '20191007' AND [Day] < '20191019'
    GROUP BY [CODE_USER], [Code]
    ORDER BY [CODE_USER]
    

    您不需要按小时分组;你在总结它。您应该按您也在聚合的列进行分组的情况很少见

    我很困惑为什么你说两周,但你的 where 子句中的日期不是相隔两周;如果有人在周末工作怎么办?我已经离开了这部分,只是想提出它,因为你会做 12 天似乎很奇怪,即只包括每隔一个周末(如果工作每两周运行一次)

    【讨论】:

    • 感谢您的指点,他们确实帮助找到了解决方案。您的代码中提供的更改在我必须删除 ORDER BY [Day] 的事实之外起作用,因为我已从 SELECT 语句的列中删除它。
    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2022-11-30
    • 2019-11-16
    相关资源
    最近更新 更多