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. (My)SQLステートメントの構文が正しいかどうかを確認するにはどうすればよいですか?

    2. JOINedの同等のものよりもパフォーマンスが高い派生テーブルクエリをさらに最適化するにはどうすればよいですか?

    3. IDで数百万行を削除する最良の方法

    4. 警告:条件の割り当て