Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server:bao nhiêu ngày mỗi mục ở mỗi trạng thái

Điều này mang lại cho bạn kết quả giống như bạn đang yêu cầu, ở một định dạng hơi khác (nhưng bạn có thể dễ dàng tìm thấy PIVOT giải pháp nếu bạn cần cùng một bộ kết quả):

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

Kết quả:

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

Lưu ý rằng tôi đang bỏ qua PreviousState từ câu hỏi của bạn và thay vào đó tôi đang xây dựng Joined bởi vì điều thực sự quan trọng là khi nào tiếp theo trạng thái có hiệu lực.

Các vấn đề không được xử lý vì bạn chưa mô tả chúng trong câu hỏi của mình:1) Phải làm gì nếu trạng thái cuối cùng hiện tại không Closed - tức là chúng ta bỏ qua điều đó hay tính cho đến ngày hôm nay? và 2) Phải làm gì nếu thời gian trong ngày cho mỗi DateChanged không giống nhau - chúng ta có phải xử lý từng ngày không?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có bất kỳ nhược điểm nào khi sử dụng NewSequentialID không?

  2. Lập chỉ mục trên một cột bit

  3. Mã khối SQL IF gây ra lỗi mặc dù nó không nên thực thi

  4. Cách thêm '$' sau '-' trong Truy vấn SQL khi định dạng tiền tệ

  5. Cách lấy giá trị theo trường động Tên bằng truy vấn sql select