2017-10-27 3 views
0

나는 현재 다음과 같은 테이블이 : 나는 각 날짜에 휴무되지 않은 ID 년대의 수를 알고 싶습니다SQL은 시작일과 종료일 사이에 오픈 티켓을 찾기

+-----+-----------------------------+------------------------------+ 
| ID |  StartDate    |  EndDate     | 
+-----+-----------------------------+------------------------------| 
| 1 | 2017-07-24 08:00:00.000 | 2017-07-29 08:00:00.000 | 
| 2 | 2017-07-25 08:00:00.000 | 2017-07-28 08:00:00.000 | 
| 3 | 2017-07-25 08:00:00.000 | 2017-07-26 08:00:00.000 | 
+-----+-----------------------------+------------------------------+ 

합니다. 예를 들어, 열린 ID의 수를 2017-07-26 00:00:00.000에 알 수는 없습니다. 이 경우 모두 3입니다.

다른 예 : 열린 ID의 수를 2017-07-29 00:00:00.000에 알 수는 없습니다. 결과는 1입니다. ID = 1 만 해당 날짜에 아직 폐쇄되지 않았습니다.

여기 StackOverflow에서 다른 솔루션을 사용해 보았습니다. 그러나 왜 이것이 잘못된 결과를 초래하는지 알 수 없습니다.

declare @dt date, @dtEnd date 
set @dt = getdate()-7 
set @dtEnd = dateadd(day, 100, @dt); 

WITH CTEt1 (SupportCallID, StartDate, EndDate, Onhold) 
as 
(SELECT SupportCallID 
    ,OpenDate 
    ,MAX(CASE WHEN StatusID IN('19381771-8E81-40C5-8E36-62A7DB0A2A99', '95C7A5FB-2389-4D14-9DAE-A08BFCC3B09A', 'D5429790-3B43-4462-9E1E-2466EA29AC74') then CONVERT(DATE, LastChangeDate) end) EndDate 
    ,OnHold 
    FROM [ClienteleITSM_Prod_Application].[dbo].[SupportCall] 
    group by SupportCallID, OpenDate, OnHold 
) 



SELECT dates.myDate, 
    (SELECT COUNT(*) 
     FROM CTEt1 
    WHERE myDate BETWEEN StartDate and EndDate 
    ) 
FROM 
(select dateadd(day, number, @dt) mydate 
from 
    (select distinct number from master.dbo.spt_values 
    where name is null 
    ) n 
where dateadd(day, number, @dt) < @dtEnd) dates 

답변

0

당신이 당신의 소스 테이블에 날짜의 범위에 걸쳐 날짜의 테이블을 만들 cte를 사용하는 경우, 당신은 쉽게 left join 소스 테이블과 행 최대 count에 그에서 반환 할 수 있습니다

declare @t table(ID int,StartDate datetime,EndDate datetime); 
insert into @t values (1,'2017-07-24 08:00:00.000','2017-07-29 08:00:00.000'),(2,'2017-07-25 08:00:00.000','2017-07-28 08:00:00.000'),(3,'2017-07-25 08:00:00.000','2017-07-26 08:00:00.000'); 

declare @StartDate datetime = (select min(StartDate) from @t); 
declare @EndDate datetime = (select max(EndDate) from @t); 

    -- Table with 10 rows in to be joined together to create a large tally table (10 * 10 * 10 * etc) 
with t(t) as (select t from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(t)) 
    -- Add the row_number of the tally table to your start date to generate all dates within your data range 
    ,d(d) as (select top(datediff(d,@StartDate,@EndDate)+1) dateadd(d,row_number() over (order by (select null))-1,@StartDate) from t t1,t t2,t t3) 
select d.d 
     ,count(t.ID) as OpenIDs 
from d 
    left join @t as t 
     on(d.d between cast(t.StartDate as date) and t.EndDate) 
group by d.d 
order by d.d; 

출력 :

+-------------------------+---------+ 
|   d   | OpenIDs | 
+-------------------------+---------+ 
| 2017-07-24 08:00:00.000 |  1 | 
| 2017-07-25 08:00:00.000 |  3 | 
| 2017-07-26 08:00:00.000 |  3 | 
| 2017-07-27 08:00:00.000 |  2 | 
| 2017-07-28 08:00:00.000 |  2 | 
| 2017-07-29 08:00:00.000 |  1 | 
+-------------------------+---------+