2017-10-27 1 views
0

Im Moment habe ich die folgende Tabelle:SQL Tickets finden Offen zwischen Beginn- und Enddatum

+-----+-----------------------------+------------------------------+ 
| 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 | 
+-----+-----------------------------+------------------------------+ 

Ich mag würde die Zählung der ID wissen, dass nicht an jedem Tag geschlossen wurden. So zum Beispiel möchte ich die Anzahl der offenen IDs auf 2017-07-26 00:00:00.000 wissen. Dies wäre in diesem Fall alles 3.

Ein anderes Beispiel: Ich wüsste nicht die Anzahl der offenen IDs auf 2017-07-29 00:00:00.000. Welches Ergebnis wäre 1. Nur ID = 1 ist zu diesem Datum noch nicht geschlossen.

Ich habe versucht, hier auf StackOverflow eine andere Lösung zu verwenden, aber ich kann nicht recht verstehen, warum es mir falsche Ergebnisse gibt.

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 

Antwort

0

Wenn Sie eine cte verwenden, um eine Tabelle der Daten zu erstellen, die den Bereich der Daten in der Quelltabelle umspannen, können Sie leicht left join aus, dass auf Ihre Quelltabelle und count auf die Zeilen zurückgegeben:

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; 

Ausgang:

+-------------------------+---------+ 
|   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 | 
+-------------------------+---------+ 
Verwandte Themen