Запрос T-SQL, возвращающий пустые строки с помощью оператора APPLY - PullRequest
0 голосов
/ 18 января 2019

Я работаю над запросом 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
  • Желаемый результат: Как показано здесь с полным кодом.
...