这是我必须从中每月查找每个员工的工作时间及其位置的表格,主要是根据其开始和结束日期来获取详细信息,并将其输入为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,因为该雇员在该月离开公司仅工作了三天。
答案 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了解更多信息。