查询以根据位置查找每个员工的每月工作时间?

时间:2019-09-04 06:28:50

标签: sql sql-server

这是我必须从中每月查找每个员工的工作时间及其位置的表格,主要是根据其开始和结束日期来获取详细信息,并将其输入为transdate。

startdate   enddate       Empno transdate   Location hours
03/07/2017  06/09/2018  11  02/04/2018  BAN 8
03/07/2017  06/09/2018  11  03/04/2018  BAN 8
03/07/2017  06/09/2018  11  04/04/2018  BAN 8
03/07/2017  06/09/2018  11  05/04/2018  BAN 8
03/07/2017  06/09/2018  11  06/04/2018  BAN 8
03/07/2017  06/09/2018  11  09/04/2018  BAN 8
03/07/2017  06/09/2018  11  10/04/2018  BAN 8
03/07/2017  06/09/2018  11  11/04/2018  BAN 8
03/07/2017  06/09/2018  11  12/04/2018  BAN 8

我写了一个相关的子查询,但是根据它们的开始和结束日期获取了总的工作时间。

Expected results:

Location Empno  Month   Year    Hours
BAN  11 Apr 2018    176
BAN  11 May 2018    176
BAN  11 Jun 2018    168
BAN  11 Jul 2018    176
BAN  11 Aug 2018    176
BAN  11 Sep 2018    176
BAN  11 Oct 2018    24

您会看到“小时数”中的最后一个值只有24,因为该雇员在该月离开公司仅工作了三天。

1 个答案:

答案 0 :(得分:0)

我们可以使用日历表来处理所有可能的工作日期,并结合年,月,日和员工的年末汇总来处理此问题:

WITH dates AS (
    SELECT '2018-01-01' AS dt UNION ALL
    SELECT '2018-01-02' UNION ALL
    SELECT '2018-01-03' UNION ALL
    ...
    SELECT '2018-12-31'
)

SELECT
    t.Location,
    t.Empno,
    CONVERT(varchar(7), d.dt, 120),
    COUNT(t.startdate) AS Hours
FROM dates d
LEFT JOIN yourTable t
    ON d.dt BETWEEN t.startdate AND t.enddate
GROUP BY
    t.Location,
    t.Empno,
    CONVERT(varchar(7), d.dt, 120);

请注意,您可能希望生成一个真正的表格来保存日期,而不是像我为方便起见而使用CTE来保存日历表的日期。阅读How to create a Calendar table for 100 years in Sql了解更多信息。