Это вопрос о пробелах и островах.
Данные испытаний - Примечание Отменено спереди и сзади для 1001 и 1003
CREATE TABLE LeaveRequest
([request_no] int, [leave_code] varchar(2), [emp_id] varchar(4), [leave_startdate] datetime, [leave_enddate] datetime)
;
INSERT INTO LeaveRequest
([request_no], [leave_code], [emp_id], [leave_startdate], [leave_enddate])
VALUES
(1001, 'AL', 'emp1', '2018-01-28 00:00:00', '2018-01-30 00:00:00'),
(1002, 'AL', 'emp1', '2018-02-01 00:00:00', '2018-02-02 00:00:00'),
(1003, 'AL', 'emp1', '2018-02-12 00:00:00', '2018-02-14 00:00:00')
;
CREATE TABLE LeaveRequestDetail
([request_no] int, [leave_starttime] datetime, [leave_endtime] datetime, [cancelsts] varchar(1))
;
INSERT INTO LeaveRequestDetail
([request_no], [leave_starttime], [leave_endtime], [cancelsts])
VALUES
(1001, '2018-01-28 08:00:00', '2018-01-28 17:00:00', 'Y'),
(1001, '2018-01-29 08:00:00', '2018-01-29 17:00:00', 'N'),
(1001, '2018-01-30 08:00:00', '2018-01-30 17:00:00', 'N'),
(1002, '2018-02-01 08:00:00', '2018-02-01 17:00:00', 'N'),
(1002, '2018-02-02 08:00:00', '2018-02-02 17:00:00', 'N'),
(1003, '2018-02-12 08:00:00', '2018-02-12 17:00:00', 'N'),
(1003, '2018-02-13 08:00:00', '2018-02-13 17:00:00', 'N'),
(1003, '2018-02-14 08:00:00', '2018-02-14 17:00:00', 'Y')
;
Я рассматриваю подобные сценарии, используя инкрементный идентификатор и комбинируя его с оконной функцией ROW_NUMBER - Обратите внимание на изменение функций ROW_NUMBER
;WITH cteX
AS(
SELECT
Id = ROW_NUMBER()OVER(ORDER BY D.request_no, D.leave_starttime ASC)
,D.request_no
,a.leave_code
,a.emp_id
,D.leave_starttime
,D.leave_endtime
,D.cancelsts
FROM LeaveRequest a
left join LeaveRequestDetail D on a.request_no = d.request_no
where a.emp_id = 'emp1' and Year(a.leave_startdate) = 2018
)
SELECT TOP 100 PERCENT
Grp = Id - ROW_NUMBER()OVER( PARTITION BY X.request_no, X.cancelsts ORDER BY X.Id)
,X.request_no
,X.leave_code
,X.leave_starttime
,X.leave_endtime
,X.cancelsts
FROM
cteX X
WHERE
X.cancelsts = 'n'
ORDER BY
X.request_no,X.emp_id
Это дает этот набор результатов, обратите внимание на столбец Grp
Grp request_no leave_code leave_starttime leave_endtime cancelsts
1 1001 AL 2018-01-29 08:00:00.000 2018-01-29 17:00:00.000 N
1 1001 AL 2018-01-30 08:00:00.000 2018-01-30 17:00:00.000 N
3 1002 AL 2018-02-01 08:00:00.000 2018-02-01 17:00:00.000 N
3 1002 AL 2018-02-02 08:00:00.000 2018-02-02 17:00:00.000 N
5 1003 AL 2018-02-12 08:00:00.000 2018-02-12 17:00:00.000 N
5 1003 AL 2018-02-13 08:00:00.000 2018-02-13 17:00:00.000 N
Затем в сочетании с CTE или производной таблицей вы можете получить ожидаемый результат
;WITH cteX
AS(
SELECT
Id = ROW_NUMBER()OVER(ORDER BY D.request_no, D.leave_starttime ASC)
,a.leave_code
,a.emp_id
,D.request_no
,D.leave_starttime
,D.leave_endtime
,D.cancelsts
FROM LeaveRequest a
left join LeaveRequestDetail D on a.request_no = d.request_no
where a.emp_id = 'emp1' and Year(a.leave_startdate) = 2018
)
SELECT
ReportId = 'rep1000' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT NULL) ) AS NVARCHAR(5))
,leave_starttime = MIN(Y.leave_starttime)
,leave_endtime = MAX(Y.leave_endtime)
,leave_code = Y.leave_code
,Count(Y.leave_starttime) as TOTAL_COUNT
FROM
(
SELECT TOP 100 PERCENT
Grp = Id - ROW_NUMBER()OVER( PARTITION BY X.request_no, X.cancelsts ORDER BY X.Id)
,X.request_no
,X.leave_code
,X.leave_starttime
,X.leave_endtime
,X.cancelsts
FROM
cteX X
WHERE
X.cancelsts = 'n'
ORDER BY
X.request_no,X.emp_id
) Y
GROUP BY
Y.Grp,Y.leave_code
выход
ReportId leave_starttime leave_endtime leave_code TOTAL_COUNT
rep10001 2018-01-29 08:00:00.000 2018-01-30 17:00:00.000 AL 2
rep10002 2018-02-01 08:00:00.000 2018-02-02 17:00:00.000 AL 2
rep10003 2018-02-12 08:00:00.000 2018-02-13 17:00:00.000 AL 2
SQLFiddle