• Basically im looking at a query for someome. Someone (not me) wrote this query to grab the punchin time for employees and punch out time. The problem is if an employed punches in more than once in a day, lets say they punch in at 9am, punch out at 12pm, then they punch in at 1pm and punch out 5pm their query only grabs the first punch in and the last punch out, so it looks like the person worked from 9am to 5pm. Based on what I understand at this point, the query isn't designed for multiple Punchin's because of the select top 1 min and max??

    SELECT DISTINCT SUBSTRING(CAST(ISNULL(tbldepartment.DepartmentNumber,0) AS VARCHAR(10)),1,3) AS FacilityID

    , empMain.employeeId AS EmployeeId,convert(varchar(10), [timecard_dt], 20) AS PunchDate,

    convert(VARCHAR(19),(

    SELECT Top 1 MIN(tw.workingpunch_ts)

    FROM timeWorkingPunch tw

    WHERE tw.employee_id = timeWorkingPunch.employee_id

    AND tw.inpunch_dt = timeWorkingPunch.inpunch_dt

    AND tw.active_yn = '1'

    AND tw.breaktype_id = 3

    AND tw.inout_id = 1),20) AS PunchIn,

    convert(VARCHAR(19),(

    SELECT TOP 1 MAX(tw.workingpunch_ts)

    FROM timeWorkingPunch tw

    WHERE tw.employee_id = timeWorkingPunch.employee_id

    AND tw.inpunch_dt = timeWorkingPunch.inpunch_dt

    AND tw.breaktype_id = 3

    AND tw.active_yn = '1'

    AND tw.inout_id = 2),20) AS PunchOut,

    (SELECT SUM(tc.worked_hr) FROM timeCard tc WHERE tc.employee_id = timeCard.employee_id AND tc.timecard_dt = timeCard.timecard_dt) AS PaidTime,

    '' AS JobCode,'' AS PayCode

    FROM timeWorkingPunch

    INNER JOIN timeCard ON timeWorkingPunch.employee_id = timeCard.employee_id

    LEFT OUTER JOIN empMain ON empMain.employee_id = timeWorkingPunch.employee_id

    LEFT OUTER JOIN tblDepartment ON tblDepartment.department_id = timeCard.department_id

    WHERE inpunch_dt = timecard_dt AND inpunch_dt > dateadd(d,datediff(d,0, dateadd(d,-15,getdate())),0) AND empmain.active_yn = '1'

    AND CAST(SUBSTRING(CAST(ISNULL(DepartmentNumber,0) AS VARCHAR(10)),1,3) AS INT) >= 409

    AND CAST(SUBSTRING(CAST(ISNULL(DepartmentNumber,0) AS VARCHAR(10)),1,3) AS INT) <= 414

    AND (

    SELECT TOP 1 MIN(tw.workingpunch_ts)

    FROM timeWorkingPunch tw

    WHERE tw.employee_id = timeWorkingPunch.employee_id

    AND tw.inpunch_dt = timeWorkingPunch.inpunch_dt

    AND tw.active_yn = '1'

    AND tw.breaktype_id = 3

    AND tw.inout_id = 1) IS NOT NULL

    Results look like (see attached).

    So I dumped the results from the query into a table and used a cte to check the freq of PUnchdate and EmployeeID:

    with cte as

    (

    select EmployeeID, PunchDate, PunchIn, PunchOut, COUNT(*) Over (PARTITION By EmployeeID, PunchDate) as Freq

    from domintest

    )

    select * from cte

    where Freq>1

    order by employeeID, PunchDate

    No results where Freq>1 so it appears the query is performing as designed?? Let me know if my logic is correct.