2016-08-12 2 views
0

стол:подсчета дней с пробелами

 
+-----------+--------------+------------+------------+ 
| RequestID | RequestStaus | StartDate | EndDate | 
+-----------+--------------+------------+------------+ 
|   1 | pending  | 9/1/2015 | 10/2/2015 | 
|   1 | in progress | 10/2/2015 | 10/20/2015 | 
|   1 | completed | 10/20/2015 | 11/3/2015 | 
|   1 | reopened  | 11/3/2015 | null  | 
|   2 | pending  | 9/5/2015 | 9/7/2015 | 
|   2 | in progress | 9/7/2015 | 9/25/2015 | 
|   2 | completed | 9/25/2015 | 10/7/2015 | 
|   2 | reopened  | 10/10/2015 | 10/16/2015 | 
|   2 | completed | 10/16/2015 | null  | 
+-----------+--------------+------------+------------+ 

Я хотел бы, чтобы вычислить дни открытых, но не включает дни между завершен и вновь. Например, RequestID 1, открытые дни будут (11/3/2015 - 9/1/2015) + (GetDate() - 11/3/2015), для запроса 2, общее количество дней будет (10/7/2015 - 9/5/2015) + (10/16/2015 - 10/10/2015).

В результате я хочу будет что-то вроде:

 
+-----------+-------------------------------+ 
| RequestID |   DaysOpened   | 
+-----------+-------------------------------+ 
|   1 | 63 + (getdate() - 11/3/2015) | 
|   2 | 38       | 
+-----------+-------------------------------+ 

Как подойти к этой проблеме? Спасибо!

+0

Вы никогда не закончить свой пример - какой результат вы ожидаете для идентификатора 1 и 2? – Hogan

+0

По вашему запросу, для RequestID 1, datys должен быть (11/3/2015 - 9/1/2015) + (GetDate() - 11/3/2015). Не так ли? –

+0

@ Танцуй-Генри, да, сэр! – Meidi

ответ

0

Протестировано. Работает хорошо. :)

Примечание: 1) Я полагаю, что required result = (FirstCompleteEndDate - PendingStartDate)+(Sum of all the Reopen duration)

2) Таким образом, я использовал самость соединения. В таблице b содержится точная запись completed, которая сразу же следует за записью in process за каждые RequestID. В таблице c приведены Sum of all the Reopen duration.

--create tbl structure 
create table #test (RequestID int, RequestStatus varchar(20), StartDate date, EndDate date) 
go 


--insert sample data 
insert #test 
select 1,'pending','09/01/2015','10/2/2015' 
union all 
select 1,'in progress','10/2/2015','10/20/2015' 
union all 
select 1,'completed','10/20/2015','11/3/2015' 
union all 
select 1,'reopened','11/3/2015',null 
union all 
select 2,'pending','09/05/2015','9/7/2015' 
union all 
select 2,'in progress','09/07/2015','9/25/2015' 
union all 
select 2,'completed','9/25/2015','10/7/2015' 
union all 
select 2,'reopened','10/10/2015','10/16/2015' 
union all 
select 2, 'completed','10/16/2015','11/12/2015' 
union all 
select 2,'reopened','11/20/2015',null 



select * from #test 



--below is solution 
select a.RequestID, a.Startdate as [PendingStartDate], b.enddate as [FirstCompleteEndDate], c.startdate as [LatestReopenStartDate], 
     datediff(day,a.startdate,b.enddate)+c.ReopenDays as [days] from #test a 
join (
    select *, row_number()over(partition by RequestID,RequestStatus order by StartDate) as rid from #test 
) as b 
on a.RequestID = b.RequestID 
join (
    select distinct RequestID, RequestStatus, max(StartDate)over(partition by RequestID,RequestStatus) as StartDate, 
      Sum(Case when enddate is null then datediff(day,startdate,getdate()) 
        when enddate is not null then datediff(day,startdate,enddate) 
      end)over(partition by RequestID,RequestStatus) as [ReopenDays] 
    from #test 
    where RequestStatus = 'reopened' 

) as c 
on b.RequestID = c.RequestID 
where a.RequestStatus ='pending' and b.RequestStatus = 'completed' and b.rid = 1 

Результат:

enter image description here

+0

У меня вопрос, что делать, если у меня есть несколько полных и повторно открываемых дат, мне нужно подвести итог, как мне это сделать? – Meidi

+0

Как, например: 2, 'completed', '9/25/2015', '10/7/2015'; 2, 'возобновлено', '10/10/2015', '10/16/2015'; 2, 'завершено', '10/16/2015', '11/12/2015'; 2, 'reopened', '11/20/2015', нужный, что вы хотите в результате –

+0

Да, что-то в этом роде, поэтому в вашем примере мне нужно добавить getdate() - '11/20/2015 '. Я не знаю, как сделать это динамически, так как может быть многократное повторное открытие и завершение. Спасибо, сэр! – Meidi

Смежные вопросы