Я работаю над запросом SQL, который объединяет информацию, если ServiceStart и ServiceEnd перекрываются с другой записью для этого провайдера. По большей части запрос работает, однако я получаю много пустых строк назад.
Я полагаю, что это может быть связано с использованием OUTER APPLY. Однако изменение OUTER APPLY на CROSS APPLY также не работает. Я также пытался указать в запросе, где ServiceID не является пустым. Результаты одинаковы в любом случае. Ниже я привел снимок экрана с результатами, которые в настоящее время возвращаются, а также ссылку на rextester.com с полным кодом.
DECLARE @StartTime DATETIME, @EndTime DATETIME
SET @StartTime = '2018-11-01'
SET @EndTime = '2018-11-05'
;WITH cte
AS (SELECT c.ClaimID,
c.ProvidedBy,
c.StartTime,
c.EndTime,
oa.ServiceStart,
oa.ServiceEnd,
c.ClaimDetailID,
c.ServiceID,
c.Duration
FROM tbl_Claims c
OUTER APPLY
(
SELECT MIN(t2.StartTime) ServiceStart,
MAX(t2.EndTime) ServiceEnd
FROM tbl_Claims t2
WHERE t2.StartTime <= c.EndTime
AND (t2.EndTime >= c.StartTime)
AND (t2.ServiceID <> 0 and c.ServiceID <> 0)
AND (t2.StartTime >= @StartTime AND t2.EndTime <= @EndTime)
AND (t2.ProvidedBy = c.ProvidedBy)
) oa)
SELECT c.ProvidedBy,
c.ServiceStart,
c.ServiceEnd,
MAX(ca1.ClaimIDs) ClaimIDs,
MAX(ca2.ClaimDetailIDs) ClaimDetailIDs,
MAX(ca3.ServiceIDs) ServiceIDs
FROM cte c
CROSS APPLY
(
SELECT STUFF(
(
SELECT ', ' + CAST(p.[ClaimID] AS VARCHAR(40))
FROM cte AS p
WHERE p.ServiceStart = c.ServiceStart AND (p.ProvidedBy = c.ProvidedBy)
AND p.ServiceID <> 0
ORDER BY p.ClaimID FOR XML PATH('')
), 1, 1, '')
) ca1(ClaimIDs)
CROSS APPLY
(
SELECT STUFF(
(
SELECT ', ' + CAST(p.[ClaimDetailID] AS VARCHAR(40))
FROM cte AS p
WHERE p.ServiceStart = c.ServiceStart AND (p.ProvidedBy = c.ProvidedBy)
AND p.ServiceID <> 0
ORDER BY p.ClaimDetailID FOR XML PATH('')
), 1, 1, '')
) ca2(ClaimDetailIDs)
CROSS APPLY
(
SELECT STUFF(
(
SELECT ', ' + CAST(p.[ServiceID] AS VARCHAR(40))
FROM cte AS p
WHERE p.ServiceStart = c.ServiceStart AND (p.ProvidedBy = c.ProvidedBy)
AND p.ServiceID <> 0
ORDER BY p.ClaimDetailID FOR XML PATH('')
), 1, 1, '')
) ca3(ServiceIDs)
GROUP BY c.ProvidedBy,
c.ServiceStart,
c.ServiceEnd
ORDER BY c.ProvidedBy,
c.ServiceStart,
c.ServiceEnd;
- Проблема в том, что я получаю нулевые строки обратно, как показано
![here](https://i.stack.imgur.com/mSvVv.png)
- Желаемый результат: Как показано здесь с полным кодом.