Hi @Analyst_SQL ,
I added some more data so that we could have data of more than one week.
I also set Saturday as the first day of the week so that we could consider Saturday, Sunday and Monday in the same week since there were more than one week in your actual data.
Please refer below updated one and check whether it is working.
drop table if exists #EmpMaster,#MonthDate,#AttendenceLOG
Create table #EmpMaster (EnrollNumber int, empName varchar(50))
Create table #MonthDate (Day varchar(50),D_Date date)
Create table #AttendenceLOG (EnrollNumber int,A_Date datetime)
Insert into #EmpMaster values (10001,'ALi')
Insert into #EmpMaster values (10002,'Kami')
Insert into #EmpMaster values (10003,'Jhon')
Insert into #EmpMaster values (10004,'Muli')
Insert into #EmpMaster values (10005,'Rose')
Insert into #MonthDate values ('Saturday','2021-05-29')
Insert into #MonthDate values ('Sunday','2021-05-30')
Insert into #MonthDate values ('Monday','2021-05-31')
Insert into #MonthDate values ('Tuesday','2021-06-01')
Insert into #MonthDate values ('Wednesday','2021-06-02')
Insert into #MonthDate values ('Saturday','2021-06-05')
Insert into #MonthDate values ('Sunday','2021-06-06')
Insert into #MonthDate values ('Monday','2021-06-07')
Insert into #MonthDate values ('Tuesday','2021-06-08')
Insert into #MonthDate values ('Wednesday','2021-06-09')
Insert into #AttendenceLOG values (10001,'2021-06-09 08:04:00')
Insert into #AttendenceLOG values (10001,'2021-06-09 17:45:00')
Insert into #AttendenceLOG values (10002,'2021-06-09 10:04:00')
Insert into #AttendenceLOG values (10003,'2021-06-09 20:04:00')
Insert into #AttendenceLOG values (10004,'2021-06-09 07:45:00')
Insert into #AttendenceLOG values (10004,'2021-06-09 09:45:00')
Insert into #AttendenceLOG values (10004,'2021-06-09 20:35:00')
Insert into #AttendenceLOG values (10005,'2021-06-07 08:04:00')
Insert into #AttendenceLOG values (10004,'2021-05-29 10:04:00')
Insert into #AttendenceLOG values (10003,'2021-06-07 08:04:00')
Insert into #AttendenceLOG values (10002,'2021-06-07 10:04:00')
Insert into #AttendenceLOG values (10001,'2021-06-07 11:04:00')
--Saturday is now considered the first day of the week
SET DATEFIRST 6;
;with cte as (
select a.EnrollNumber,b.D_Date,b.Day,c.A_Date
from #EmpMaster a
cross join #MonthDate b
left join #AttendenceLOG c
on a.EnrollNumber=c.EnrollNumber
and cast(c.A_Date as date)=b.D_Date)
,cte1 AS (
SELECT EnrollNumbeR,D_Date,Day
,MIN(A_Date) [IN(A_Date)],MAX(A_Date) [OUT(A_Date)]
FROM CTE
GROUP BY EnrollNumbeR,D_Date,Day)
,CTE2 AS (
SELECT EnrollNumbeR,D_Date,Day
,CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN NULL ELSE [IN(A_Date)] END [IN(A_Date)]
,CASE WHEN [OUT(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([OUT(A_Date)] AS DATE) AS DATETIME)) THEN [OUT(A_Date)] ELSE NULL END [OUT(A_Date)]
FROM cte1)
,SUNDAY AS (
SELECT *,datepart(week, d_date) weekno FROM CTE2
WHERE ([IN(A_Date)] IS NOT NULL OR [OUT(A_Date)] IS NOT NULL)
AND [DAY] IN ('Saturday','Monday')
)
,CTE3 AS (
SELECT a.*
,CASE WHEN a.[DAY] ='Sunday' AND b.EnrollNumbeR is not null THEN 'S'
WHEN a.[IN(A_Date)] IS NULL AND a.[OUT(A_Date)] IS NULL THEN 'A'
WHEN DATEDIFF(HOUR,a.[IN(A_Date)],a.[OUT(A_Date)])>=8 THEN 'P'
ELSE 'A' END STATUS,
CASE WHEN a.[IN(A_Date)] IS NOT NULL AND a.[OUT(A_Date)] IS NOT NULL AND DATEDIFF(HOUR,a.[IN(A_Date)],a.[OUT(A_Date)])>=8
THEN CAST(CAST(DATEDIFF(MINUTE,a.[IN(A_Date)],a.[OUT(A_Date)]) AS FLOAT)/60 AS decimal(10,2)) ELSE 0 END [HOUR]
FROM CTE2 a left join SUNDAY b on a.EnrollNumbeR=b.EnrollNumbeR and datepart(week, a.d_date)=b.weekno
)
SELECT EnrollNumber,D_Date,Day,
CASE WHEN [IN(A_Date)] IS NOT NULL OR [OUT(A_Date)] IS NOT NULL
THEN CONCAT(FORMAT([IN(A_Date)],'yyyy-MM-dd hh:mm:ss tt'),CHAR(10),FORMAT([OUT(A_Date)],'yyyy-MM-dd hh:mm:ss tt'))
ELSE [STATUS] END [IN(A_Date)]
,HOUR
FROM CTE3
ORDER BY D_Date,EnrollNumbeR
Output:
EnrollNumber D_Date Day IN(A_Date) HOUR
10001 2021-05-29 Saturday A 0.00
10002 2021-05-29 Saturday A 0.00
10003 2021-05-29 Saturday A 0.00
10004 2021-05-29 Saturday 2021-05-29 10:04:00 AM 0.00
10005 2021-05-29 Saturday A 0.00
10001 2021-05-30 Sunday A 0.00
10002 2021-05-30 Sunday A 0.00
10003 2021-05-30 Sunday A 0.00
10004 2021-05-30 Sunday S 0.00
10005 2021-05-30 Sunday A 0.00
10001 2021-05-31 Monday A 0.00
10002 2021-05-31 Monday A 0.00
10003 2021-05-31 Monday A 0.00
10004 2021-05-31 Monday A 0.00
10005 2021-05-31 Monday A 0.00
10001 2021-06-01 Tuesday A 0.00
10002 2021-06-01 Tuesday A 0.00
10003 2021-06-01 Tuesday A 0.00
10004 2021-06-01 Tuesday A 0.00
10005 2021-06-01 Tuesday A 0.00
10001 2021-06-02 Wednesday A 0.00
10002 2021-06-02 Wednesday A 0.00
10003 2021-06-02 Wednesday A 0.00
10004 2021-06-02 Wednesday A 0.00
10005 2021-06-02 Wednesday A 0.00
10001 2021-06-05 Saturday A 0.00
10002 2021-06-05 Saturday A 0.00
10003 2021-06-05 Saturday A 0.00
10004 2021-06-05 Saturday A 0.00
10005 2021-06-05 Saturday A 0.00
10001 2021-06-06 Sunday S 0.00
10002 2021-06-06 Sunday S 0.00
10003 2021-06-06 Sunday S 0.00
10004 2021-06-06 Sunday A 0.00
10005 2021-06-06 Sunday S 0.00
10001 2021-06-07 Monday 2021-06-07 11:04:00 AM 0.00
10002 2021-06-07 Monday 2021-06-07 10:04:00 AM 0.00
10003 2021-06-07 Monday 2021-06-07 08:04:00 AM 0.00
10004 2021-06-07 Monday A 0.00
10005 2021-06-07 Monday 2021-06-07 08:04:00 AM 0.00
10001 2021-06-08 Tuesday A 0.00
10002 2021-06-08 Tuesday A 0.00
10003 2021-06-08 Tuesday A 0.00
10004 2021-06-08 Tuesday A 0.00
10005 2021-06-08 Tuesday A 0.00
10001 2021-06-09 Wednesday 2021-06-09 08:04:00 AM 2021-06-09 05:45:00 PM 9.68
10002 2021-06-09 Wednesday 2021-06-09 10:04:00 AM 0.00
10003 2021-06-09 Wednesday 2021-06-09 08:04:00 PM 0.00
10004 2021-06-09 Wednesday 2021-06-09 07:45:00 AM 2021-06-09 08:35:00 PM 12.83
10005 2021-06-09 Wednesday A 0.00
If above is still not working, please kindly provide more sample data of one month and expected output.
Best regards,
Melissa
If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.