Ich bin kein DBA, ich weiß genug, um mich in Schwierigkeiten zu bringen, ist alles so mit mir hier. Ich versuche, den Datumunterschied von einer Reihe von Daten zu finden, aber bedingte Unterschiede zwischen Sätzen nur basierend auf einer Statusänderung zu summieren. Das Problem, das ich habe, zählt nicht Tage basierend auf den Regeln, die ich haben muss.SQL Sum Datediff verschiedene Zeilen bedingt
Verwendung von SQL 2008 R2, mit diesen Regeln:
- Aufzeichnungen, wo oldValue zu newValue ist (NULL zu 'etwas') wird immer = MIN;
- Tageszählung nur hinzufügen, wenn oldValue ungleich Close oder Deferred ist;
- NICHT Tag zählt zwischen Änderungen hinzufügen, wo bisher bekannten newValue aktuellen Datensatz entspricht oldValue und ist gleich geschlossen oder
Latente Verwendung:
declare @t table
(
tranID int,
orderNum varchar(20),
oldValue varchar(2000),
newValue varchar(2000),
tranTime datetime
)
insert into @t values(140,3, NULL, 'Closed', '2013-01-05 12:00:00.000')
insert into @t values(160,4, NULL, 'Defered', '2013-01-07 18:00:00.000')
insert into @t values(101,5, NULL, 'New', '2013-01-01 10:01:00.000')
insert into @t values(111,5, 'New', 'Closed', '2013-01-02 10:00:00.000')
insert into @t values(102,6, NULL, 'New', '2013-01-01 10:02:00.000')
insert into @t values(112,6, 'Open', 'Deferred', '2013-01-02 10:10:00.000')
insert into @t values(132,6, 'Deferred', 'Closed', '2013-01-04 11:00:00.000')
insert into @t values(103,7, NULL, 'New', '2013-01-01 10:03:00.000')
insert into @t values(123,7, 'Ready', 'Closed', '2013-01-03 11:30:00.000')
insert into @t values(133,7, 'Closed', 'Open', '2013-01-04 11:11:00.000')
insert into @t values(143,7, 'Passed', 'Closed', '2013-01-05 12:15:00.000')
insert into @t values(104,8, NULL, 'New', '2013-01-01 10:04:00.000')
insert into @t values(114,8, 'Open', 'Closed', '2013-01-02 10:20:00.000')
insert into @t values(134,8, 'Closed', 'Open', '2013-01-04 11:22:00.000')
insert into @t values(144,8, 'Failed', 'Deferred', '2013-01-05 12:30:00.000')
insert into @t values(154,8, 'Deferred', 'Closed', '2013-01-06 17:00:00.000')
Ich erwarte wie eine Ausgabe etwas zu sehen:
Wir haben eine Reihe von Bestellungen, die Transaktionen haben, die in der ID basierend auf dem geänderten Datum erhöhen. Die sortierte TRID wird wiederum die Daten sortieren. Um zu sehen, dass die Daten leicht in den Regeln gruppiert sind, müssen wir nach orderNum und dann nach tranID sortieren und Sie können sehen, dass orderNum mit seinen übereinstimmenden Änderungen in der Reihenfolge ihres Auftretens gut aufgereiht ist. Ich habe eine Abfrage, die mir das Datum Diff für die Min- und Max-Daten geben wird, aber dies wird sich nicht an die Regeln halten, wo ich keine Tage hinzufüge, während die Bestellung geschlossen oder zurückgestellt ist.
Select orderNum
,MIN(tranTime)as Opened
,MAX(tranTime) as LastClose
,DATEDIFF(DAY,MIN(tranTime),MAX(tranTime)) as resolveDays
,Count(tranTime) as QtyChanged
from @t
group by orderNum
order by orderNum
Ich habe versucht, mit einem Fall-Schalter über die OrderNum zusammenzufassen, aber nicht die Zählungen richtig zeigen, bekommen konnte, was zu versuchen, RANK oder ROW_NUMBER OVER der OrderNum zu verwenden führte mich ein Selbst zu tun kommen als im bisherigen Rekord und überprüfe die case-Bedingung von oldValue und newValue, aber mir fehlt etwas, um die Teile zu verbinden. Ich habe mir auch Inseln und Lückenlösungen angesehen, aber ich bin nicht in der Lage, diese Punkte zu verbinden, um mein erwartetes Ergebnis zu erhalten. Was kann ich sonst noch hier versuchen?
Können Sie case-Anweisung nicht verwenden? –
konnte ich nicht erfolgreich. Mit der Notwendigkeit, jede Gruppe von OrderNum-Records in der Reihenfolge der tranID zu inspizieren, kann ich nicht Situationen wie OrderNum 8 auffangen. Die letzten 2 Transaktionen addieren keine bearbeitete Zeit, sondern die 3. in die 4. tun. Wenn du einen hast, der Ergebnisse bringen kann, wie ich es erwarte, würde ich gerne lernen, wo ich falsch liege. –
Was ist der vorherige bekannte newValue? Ein bisschen eine Erklärung über diese PLZ. –