Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:ile dni każdy element był w każdym stanie

Daje to te same wyniki, o które prosisz, w nieco innym formacie (ale możesz łatwo znaleźć PIVOT rozwiązania, jeśli potrzebujesz dokładnie tego samego zestawu wyników):

declare @t table (ItemId int,Revision int,State varchar(19),DateChanged datetime2)
insert into @t(ItemId,Revision,State,DateChanged) values
(1,1,'New',   '2014-11-13T10:00:00'),
(1,2,'Active','2014-11-15T10:00:00'),
(1,3,'New',   '2014-11-17T10:00:00'),
(1,4,'Active','2014-11-19T10:00:00'),
(1,5,'Active','2014-11-20T10:00:00'),
(1,6,'Closed','2014-11-22T10:00:00'),
(2,1,'New',   '2014-11-13T10:00:00'),
(2,2,'Active','2014-11-16T10:00:00'),
(2,3,'Closed','2014-11-17T10:00:00'),
(2,4,'Active','2014-11-19T10:00:00'),
(2,5,'Closed','2014-11-21T10:00:00')

;With Joined as (
    select t1.ItemId,t1.State,DATEDIFF(day,t1.DateChanged,t2.DateChanged) as Days
    from
        @t t1
            inner join
        @t t2
            on
                t1.ItemId = t2.ItemId and
                t1.Revision = t2.Revision -1
    )
select ItemId,State,SUM(Days)
from Joined
where State <> 'Closed'
group by ItemId,State

Wynik:

ItemId      State               
----------- ------------------- -----------
1           Active              5
1           New                 4
2           Active              3
2           New                 3

Zauważ, że ignoruję PreviousState kolumna z twojego pytania i zamiast tego konstruuję Joined bo tak naprawdę liczy się kiedy następny stan wszedł w życie.

Problemy, które nie zostały rozwiązane, ponieważ nie opisałeś ich w swoim pytaniu:1) Co zrobić, jeśli obecny stan końcowy nie jest Closed - tj. czy to ignorujemy, czy liczymy do dzisiaj? oraz 2) Co zrobić, jeśli pora dnia dla każdego DateChanged to nie to samo - czy musimy obsługiwać częściowe dni?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobieranie relacji SQL jako ciągu rozdzielanego przecinkami

  2. Jak uzyskać sześciotygodniową liczbę niedziel za pomocą Weekno w SQL Server 2008?

  3. Znaleźć prawdziwą nazwę kolumny aliasu używanego w widoku?

  4. Jak odczytać klucz pliku konfiguracyjnego w procedurze składowanej SQL Server 2008

  5. Aby zmienić format daty w sql