@ X-Zero имеет точку - запрос возвращает два столбца для BreakStart и BreakEnd, поэтому, если сотрудник сделал ДВА перерыва, просто невозможно показать значимые результаты.
Если предположить, что сотрудники берут 0 или 1 перерыв в день, это, вероятно, даст вам то, что вы просили:
-- This part gets data for everyone that took a break.
-- Hopefully they took only ONE break
-- (if they took more, we'll get multiple rows here)
Select A.EventDate 'Date'
,A.PersonFullName 'Employee'
,A.StartDtm 'ShiftStart'
,A.OutPunchDtm 'BreakStart'
,B.StartDtm 'BreakEnd'
,B.OutPunchDtm 'ShiftEnd'
From vp_TimeSheetPunch A
Join vp_TimeSheetPunch B On A.EventDate=B.EventDate
And A.PersonNum=B.PersonNum
And A.StartDtm<B.StartDtm
Union
-- This part gets data for everyone that did not take a break.
Select C.EventDate 'Date'
,C.PersonFullName 'Employee'
,C.StartDtm 'ShiftStart'
,Null 'BreakStart'
,Null 'BreakEnd'
,C.OutPunchDtm 'ShiftEnd'
From vp_TimeSheetPunch C
Where Not Exists(Select *
From vp_timesheetpunch D
Where C.EventDate=D.EventDate
And C.PersonNum=D.PersonNum
And C.StartDtm<>D.StartDtm)
-- This orders the result using column numbers
Order By 1,2,3,4
Это должно сделать это.