2016-06-22 19 views
3

Ich habe versucht, dieses Problem zu lösen, aber meine "Oriented Language" Meinung lässt mich nicht herausfinden, wie man Tage in einer SQL-Abfrage summiert.Berechne Schätzung Zeit Zeile

enter image description here

Im Grunde habe ich in meiner Datenbank eine Tabelle mit den Anforderungen und dem Tage der Status der Anfrage war Open, Ausstehend oder geschlossen.

Ich möchte eine Abfrage zurückgeben, die angibt, wie viele Tage der Status geöffnet war und wie viele ausstehend war.

Die offenen Tage werden vom DATEDIFF zwischen einer offenen Anfrage und dem Moment, in dem die Anfrage in den Status "Anstehend/Geschlossen" verschoben wurde, berechnet. Die ausstehenden Anforderungen sind der DATEDIFF zwischen dem Moment, in dem eine Anforderung in Pending verschoben wird und der Moment wieder Open ist.

Ich habe in einigen Lösungen gearbeitet, muss aber ehrlich sein und sagen, ich bin nicht einmal in der Nähe.

Vielen Dank für Ihre Unterstützung!

+2

Sie nicht genug gegeben haben Informationen in der Frage für uns, um eine Antwort zu geben. Bitte lesen Sie [Tipps zum Stellen einer guten SQL-Frage] (http://meta.stackoverflow.com/a/271056/2835541). –

+0

Chris, ich zeigte die Tabelle, die ich habe und die Abfrage, die ich zurückgeben möchte. Welche Informationen benötigst du mehr, damit ich es zur Verfügung stellen kann? –

+0

Ich füge eine kurze Erklärung hinzu, wie die offenen und anstehenden Tage berechnet werden, hoffe das hilft. –

Antwort

1
;WITH cte AS(
SELECT ID, 
     [Request ID], 
     [Status], 
     CreationDate, 
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CreationDate) as rn 
FROM YourTable y 
) 

SELECT * 
FROM (
    SELECT c1.ID, 
      c1.[Status], 
      DATEDIFF(day,c1.CreationDate,c2.CreationDate) as [days] 
    FROM cte c1 
    LEFT JOIN cte c2 
     ON c1.rn+1 = c2.rn AND c1.ID = c2.ID 
    ) as p 
PIVOT (
    SUM([days]) FOR [Status] IN ([Open], [Pending]) 
) as pvt 

Ausgang:

ID  Open Pending 
GTGTG6 4  5 
+1

@ LuísBaptistaLourenço Ich habe die Antwort geändert, jetzt funktioniert es, wenn Sie viele IDs haben – gofr1

+0

gofr1, ich bekomme den folgenden Fehler: Die Spalte 'Id' wurde mehrfach für 'cte' angegeben. Kannst du helfen? Vielen Dank. –

+1

Welche Spalten haben Sie in dieser Tabelle? Vielleicht verbinden Sie zwei oder mehr Tische? Anstelle von '*' nur Felder auflisten, die Sie verwenden müssen, wenn sie denselben Namen haben, fügen Sie 'as SomeNewName' hinzu. – gofr1

1

Ich bin nicht sicher, dass dies für Sie hilfreich, da ich nicht wirklich Daten haben dies zu testen,

SELECT ID, 
    MAX(CASE WHEN STATUS='OPEN' THEN DAY(CreationDate) END)- MIN(CASE WHEN STATUS='OPEN' THEN DAY(CreationDate) END)OPENDAYS, 
    MAX(CASE WHEN STATUS = 'CLOSE' THEN DAY(CreationDate)-1 END)- (MAX(CASE WHEN STATUS = 'PENDING' THEN DAY(CreationDate) END)- MIN(CASE WHEN STATUS = 'PENDING' THEN DAY(CreationDate) END)) PENDINGDAYS    
FROM TABLENAME     
GROUP BY ID 
+1

Danke Jay :) Gonna auch sehen, wie das für mich funktioniert! –