Итак, Стив C, я попытался вам помочь ... Я сделал несколько cte
- cte (cteBreak) - вы просто выбираете только перерывы.
- cte (breaks_chains) - нумерация каждого перерыва (поскольку нельзя использовать row_numbing)
- breaks_chains - получить интервалы перерывов по парам (например, время первого перерыва - время второго перерыва, время второго перерыва, время третьего перерыва)
Примечание: если это последний интервал, то столбец end_break заменяется getdate (), просто для закрытия интервала
и наконец объединяем нашу таблицу с breaks_chains Вместо Table введите свое Имя таблицы
--just get rows with BREAK paycode
with cteBreak as
(
select * from Table where paycode='BREAK'
),
--numbering breaks (=row_numbering() in later version sql server)
breaks_chains as
(
select cte1.visitstart visit_st,count(cte2.visitstart)+1 Num from cteBreak cte1
left join cteBreak cte2
on cte1.visitstart>cte2.visitstart
group by cte1.visitstart
),
--get pairs as "start_break - end_break"
break_interval as
(
select t1.visit_st begin_break, COALESCE(t2.visit_st,getdate()) as end_break,t1.Num from
breaks_chains t1
left join breaks_chains t2
on t2.Num-t1.Num=1
)
select sum(duration) from
(
select duration,paycode,
case
when
(Table.visitstart>break_interval.begin_break
and Table.visitstart<break_interval.end_break)
then break_interval.end_break
when (Table.visitstart<break_interval.begin_break and Num=1)
then break_interval.begin_break
end NumGroup
from Table
left join break_interval
on
(Table.visitstart>break_interval.begin_break
and Table.visitstart<break_interval.end_break)
or
(Table.visitstart<break_interval.begin_break and Num=1) --for first sequence (before first break)
)t
where paycode<>'BREAK'
group by NumGroup
PS Если есть вопросы, напишите в комментариях)