Перекрытие SQL с группой по - PullRequest
0 голосов
/ 08 мая 2020

У меня вопрос относительно перекрытия в SQL, у меня есть следующая структура и данные из моей базы данных:

Table A (Id = uniqueidentifier)
| Name |  StartDate  |    EndDate    | DaysToReceive |
------------------------------------------------------
|   A  |  2019-08-26 |   2020-04-13  | 232           |
|   A  |  2019-12-15 |   2020-04-11  | 119           |
|   A  |  2020-03-06 |   2020-03-31  | 26            |
|   B  |  2020-01-07 |   2020-01-31  | 25            |
|   B  |  2020-02-11 |   2020-02-29  | 19            |

Мне нужно получить дни для получения, но если есть перекрытие, я нужна разница между минимальной датой и максимальной датой, иначе я использую DaysToReceive Суммированный столбец.

Я пытаюсь получить результат, который будет выглядеть так:

| Name | DaysToReceive |
------------------------
   A   |     232
   B   |     44

I удалось получить этот запрос, но работает только в дни перекрытия.

select DATEDIFF(d, MIN(t1.dt),MAX(t1.enddt)) + 1 as DaysToReceive
from (
    select distinct cp1.dt, min(cp2.dt) enddt
    from ( select StartDate as dt, Id from TableA ) cp1, 
         ( select EndDate as dt from TableA ) cp2
    where cp2.dt > cp1.dt cp1.Id = cp2.Id
    group by cp1.dt
    ) t1, TableA t2
where t2.StartDate between t1.dt and t1.enddt
group by t1.dt, t1.enddt

Заранее благодарим. Ура

1 Ответ

0 голосов
/ 09 мая 2020

Отметьте это

Select [name], Case when [InRange] = 1 
   then Max(DateDiff(dd, MinStartdate, MaxEnddate) + 1)
   Else
       Sum(DateDiff(dd, Startdate, Enddate) + 1)
   End as [Days]

from
(
Select Distinct a.[name], StartDate, EndDate, MinStartdate, MaxEnddate,
    Case when StartDate > MinStartdate and EndDate < MaxEnddate or 
    (StartDate = MinStartdate and EndDate = MaxEnddate)  then
        1 Else 0  
        End as [InRange]
from
(
SELECT [name], 
   Min(StartDate) AS MinStartdate, Max(EndDate) AS MaxEnddate 
FROM A
Group By [Name]

) Q
inner join A a
on a.[name] = q.[name]
) QQ

и вот скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...