sql >> Database >  >> RDS >> Sqlserver

SQL Server:hoeveel dagen was elk item in elke staat

Dit geeft u dezelfde resultaten waar u om vraagt, in een iets ander formaat (maar u kunt PIVOT gemakkelijk vinden oplossingen als u exact dezelfde resultatenset nodig heeft):

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

Resultaat:

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

Merk op dat ik de PreviousState . negeer kolom van uw vraag en in plaats daarvan bouw ik Joined want wat er echt toe doet is wanneer de volgende staat in werking getreden.

Problemen die niet zijn opgelost omdat u ze niet in uw vraag hebt beschreven:1) Wat te doen als de huidige eindstatus niet Closed is - d.w.z. negeren we dat, of tellen we tot vandaag?, en 2) Wat te doen als de tijd van de dag voor elke DateChanged is niet hetzelfde - hebben we te maken met gedeeltelijke dagen?



  1. Hoe los ik met SSDT SQL71561-fouten op als ik een weergave heb die verwijst naar objecten in een andere database?

  2. AJAX update MYSQL-database met behulp van de functie aangeroepen vanuit HTML gegenereerd vanuit PHP

  3. Laravel 5.4 Upgrade -- Integriteitsbeperkingsschending - Kolom kan niet null zijn

  4. Kan ik een aangepaste query pagineren zonder de standaard paginering te overschrijven?