Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server:колко дни всеки елемент е бил във всяко състояние

Това ви дава същите резултати, които искате, в малко по-различен формат (но можете лесно да намерите PIVOT решения, ако имате нужда от абсолютно същия набор от резултати):

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

Резултат:

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

Имайте предвид, че пренебрегвам PreviousState колона от вашия въпрос и вместо това изграждам Joined защото това, което наистина има значение, е кога следната състояние влезе в сила.

Проблеми, които не са разгледани, защото не сте ги описали във вашия въпрос:1) Какво да направите, ако текущото крайно състояние не е Closed - т.е. пренебрегваме ли това или броим до днес? и 2) Какво да правим, ако времето от деня за всяка DateChanged не е същото - трябва ли да обработваме частични дни?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на символи в средата на низ в SQL Server (T-SQL)

  2. Създаване на динамична клауза where в съхранена процедура на SQL Server

  3. .NET TransactionScopes и SQL 2005 Lightweight Transaction Manager - Множество връзки един и същ SPID?

  4. Събития на изчакване на SQL сървър -2

  5. Изберете колони от набора от резултати на съхранената процедура