Здесь снова мой комментарий в качестве ответа с примером:
Я предлагаю использовать cte / подзапросы для решения этой проблемы ... прежде всего, выберите EmpID, время и количество строк (разделение по empid и порядке по времени) - это дает вам все проверки с нечетным номером и все проверки с четным номером. Далее - на основе этого запроса - выберите empid, time и CASE WHEN. Rownumber% 2 = 0 THEN 'CHECKOUT' ELSE 'CHECKIN' END AS CheckInOut ... этот результат снова можно использовать в вашем сводном операторе
Пример :
WITH cte AS(
SELECT *, ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY CheckInOut) rn
FROM T1
),
cteInOut AS(
SELECT EmpID, CheckInOut, CASE WHEN rn%2 = 0 THEN N'CheckOut' ELSE N'CheckIn' END AS CheckInOutState
FROM cte
),
cteInOuntSrt AS(
SELECT EmpID, CheckInOut, CheckInOutState, ROW_NUMBER() OVER (PARTITION BY EmpID, CheckInOutState ORDER BY CheckInOut) rn1
FROM cteInOut
)
select EmpID, rn1 AS CheckIndIdx, CheckIn, CheckOut
from cteInOuntSrt
pivot
(
min(CheckInOut)
for CheckInOutState in ([CheckIn], [CheckOut])
) piv
ORDER BY 1, 2;
скрипка: http://sqlfiddle.com/#! 18 / af6f3 / 1/1