Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server:berapa hari setiap item berada di setiap negara bagian

Ini memberi Anda hasil yang sama yang Anda minta, dalam format yang sedikit berbeda (tetapi Anda dapat dengan mudah menemukan PIVOT solusi jika Anda membutuhkan kumpulan hasil yang sama persis):

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

Hasil:

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

Perhatikan bahwa saya mengabaikan PreviousState kolom dari pertanyaan Anda dan saya malah membangun Joined karena yang terpenting adalah kapan berikutnya negara mulai berlaku.

Masalah tidak ditangani karena Anda belum menjelaskannya dalam pertanyaan Anda:1) Apa yang harus dilakukan jika status akhir saat ini tidak Closed - apakah kita mengabaikannya, atau menghitung sampai hari ini?, dan 2) Apa yang harus dilakukan jika waktu untuk setiap DateChanged tidak sama - apakah kita harus menangani sebagian hari?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks terbaik untuk digunakan untuk Pernyataan OR di SQL Server

  2. ORDER BY dengan Case-Statement DESC

  3. WHERE IS NULL, IS NOT NULL atau NO WHERE klausa tergantung pada nilai parameter SQL Server

  4. Menggunakan PIVOT dan BERGABUNG bersama

  5. Apakah ada cara untuk menambahkan 2 Tabel saat menggunakan pernyataan INSERT di pembuat kueri?