2016-07-13 10 views
0

私はDBAではありません、私はトラブルで自分自身を取得するのに十分知っている私はここで私をすべて負担しています。私はデータのセットから日付の違いを見つけることを試みていますが、状態の変化に基づいてレコード間の条件付き差異の合計だけです。私が持っている問題は、必要なルールに基づいて日数を数えていないことです。SQL Sum Datediff異なる行条件付きで

これらの規則で、SQL 2008 R2を使用する:newValueにまでOLDVALUEは( '何' とNULL)である

  • レコードは常に= MIN。
  • oldValueがCloseまたはDeferredでない場合にのみ、日数を加算します。

    declare @t table 
    (
        tranID int, 
        orderNum varchar(20), 
        oldValue varchar(2000), 
        newValue varchar(2000), 
    tranTime datetime 
    ) 
    
    insert into @t values(140,3, NULL, 'Closed', '2013-01-05 12:00:00.000') 
    insert into @t values(160,4, NULL, 'Defered', '2013-01-07 18:00:00.000') 
    insert into @t values(101,5, NULL, 'New', '2013-01-01 10:01:00.000') 
    insert into @t values(111,5, 'New', 'Closed', '2013-01-02 10:00:00.000') 
    insert into @t values(102,6, NULL, 'New', '2013-01-01 10:02:00.000') 
    insert into @t values(112,6, 'Open', 'Deferred', '2013-01-02 10:10:00.000') 
    insert into @t values(132,6, 'Deferred', 'Closed', '2013-01-04 11:00:00.000') 
    insert into @t values(103,7, NULL, 'New', '2013-01-01 10:03:00.000') 
    insert into @t values(123,7, 'Ready', 'Closed', '2013-01-03 11:30:00.000') 
    insert into @t values(133,7, 'Closed', 'Open', '2013-01-04 11:11:00.000') 
    insert into @t values(143,7, 'Passed', 'Closed', '2013-01-05 12:15:00.000') 
    insert into @t values(104,8, NULL, 'New', '2013-01-01 10:04:00.000') 
    insert into @t values(114,8, 'Open', 'Closed', '2013-01-02 10:20:00.000') 
    insert into @t values(134,8, 'Closed', 'Open', '2013-01-04 11:22:00.000') 
    insert into @t values(144,8, 'Failed', 'Deferred', '2013-01-05 12:30:00.000') 
    insert into @t values(154,8, 'Deferred', 'Closed', '2013-01-06 17:00:00.000') 
    

    は、私のような出力に何かを見て期待しています:以前知らnewValueは、現在のレコードOLDVALUEに等しく、クローズに等しいか、または使用

繰延です

  • は変化の間で一日数を追加しないでください。

    orderNum | resolveDays 
    ---------------------- 
        3 |  0 
        4 |  0 
        5 |  1 
        6 |  1 
        7 |  3 
        8 |  2 
    

    私たちは、日付に基づいてIDが増加するトランザクションを持つ一連の注文を持っています。ソートされたtranIDは日付をソートします。 orderNum、tranIDで注文する必要のあるルールで簡単にグループ化されたデータを確認するには、orderNumが一致する変更を順番に並べて表示することができます。 私は最小日と最大日の差分を返すクエリを持っていますが、これはルールを守らずに日を追加していない間に注文が閉じられたり延期されたりします。

    Select orderNum 
         ,MIN(tranTime)as Opened 
         ,MAX(tranTime) as LastClose 
         ,DATEDIFF(DAY,MIN(tranTime),MAX(tranTime)) as resolveDays 
         ,Count(tranTime) as QtyChanged 
    from @t 
    group by orderNum 
    order by orderNum 
    

    は私が前のレコードに参加する場合のスイッチとorderNumにわたり合計することを試みたが、カウントが自己を行うにはorderNum OVER RANKまたはROW_NUMBERを使用しようとする私を導いている正しく表示することができませんでしたoldValueとnewValueの大文字小文字の状態をチェックしますが、ピースを接続する何かがありません。私は島やギャップソリューションも見てきましたが、期待通りの結果を得るためにこれらの点を結びつけることはできません。他に何が私はここで試すことができますか?

  • +0

    あなたはケース文を使用できませんか? –

    +0

    私は正常にできませんでした。 orderNumレコードの各グループをtranIDの順番で調べる必要があるため、orderNum 8のような状況を捉えることはできません。最後の2回のトランザクションでは、作業時間は加算されませんが、3回目は4回目に追加されます。私が期待しているような結果を生むものがあれば、どこに間違っているのか学びたいと思う。 –

    +0

    これまでに知られているnewValueは何ですか?そのPLZについての説明のビット。 –

    答えて

    0

    てみクエリ次

    DECLARE @t TABLE 
    (
        tranID INT, 
        orderNum VARCHAR(20), 
        oldValue VARCHAR(2000), 
        newValue VARCHAR(2000), 
        tranTime DATETIME 
    ) 
    
    INSERT INTO @t VALUES(140,3, NULL, 'Closed', '2013-01-05 12:00:00.000') 
    INSERT INTO @t VALUES(160,4, NULL, 'Defered', '2013-01-07 18:00:00.000') 
    INSERT INTO @t VALUES(101,5, NULL, 'New', '2013-01-01 10:01:00.000') 
    INSERT INTO @t VALUES(111,5, 'New', 'Closed', '2013-01-02 10:00:00.000') 
    INSERT INTO @t VALUES(102,6, NULL, 'New', '2013-01-01 10:02:00.000') 
    INSERT INTO @t VALUES(112,6, 'Open', 'Deferred', '2013-01-02 10:10:00.000') 
    INSERT INTO @t VALUES(132,6, 'Deferred', 'Closed', '2013-01-04 11:00:00.000') 
    INSERT INTO @t VALUES(103,7, NULL, 'New', '2013-01-01 10:03:00.000') 
    INSERT INTO @t VALUES(123,7, 'Ready', 'Closed', '2013-01-03 11:30:00.000') 
    INSERT INTO @t VALUES(133,7, 'Closed', 'Open', '2013-01-04 11:11:00.000') 
    INSERT INTO @t VALUES(143,7, 'Passed', 'Closed', '2013-01-05 12:15:00.000') 
    INSERT INTO @t VALUES(104,8, NULL, 'New', '2013-01-01 10:04:00.000') 
    INSERT INTO @t VALUES(114,8, 'Open', 'Closed', '2013-01-02 10:20:00.000') 
    INSERT INTO @t VALUES(134,8, 'Closed', 'Open', '2013-01-04 11:22:00.000') 
    INSERT INTO @t VALUES(144,8, 'Failed', 'Deferred', '2013-01-05 12:30:00.000') 
    INSERT INTO @t VALUES(154,8, 'Deferred', 'Closed', '2013-01-06 17:00:00.000') 
    ------ 
    DECLARE @TmpTable TABLE 
    (
        Id INT, 
        tranID INT, 
        orderNum VARCHAR(20), 
        oldValue VARCHAR(2000), 
        newValue VARCHAR(2000), 
        tranTime DATETIME 
    ) 
    ------ 
    INSERT INTO @TmpTable 
    SELECT 
        ROW_NUMBER() OVER(PARTITION BY orderNum ORDER BY tranID) Id, 
        tranID, 
        orderNum, 
        oldValue, 
        newValue, 
        tranTime 
    FROM 
        @t  
    ------ 
    SELECT 
        CurrentRow.orderNum, 
        SUM(
         CASE 
          WHEN CurrentRow.newValue = NextRow.oldValue AND 
           NextRow.oldValue IN ('Closed', 'Deferred') THEN 0 
          ELSE ISNULL(DATEDIFF(DAY, CurrentRow.tranTime, NextRow.tranTime), 0) END 
         ) AS resolveDays 
    FROM 
        @TmpTable CurrentRow LEFT JOIN 
        @TmpTable NextRow ON CurrentRow.orderNum = NextRow.orderNum AND 
             CurrentRow.Id = (NextRow.Id - 1) 
    GROUP BY CurrentRow.orderNum 
    

    出力:

    orderNum    resolveDays 
    -------------------- ----------- 
    3     0 
    4     0 
    5     1 
    6     1 
    7     3 
    8     2 
    
    +0

    これはトリックを行っているようです!私はこれを私のデータセットで実行していますが、現時点でいくつかのスポットテストを行っています。私の誤解は、セルフ・ジョインの比較ポイントとしてROW_NUMBERを考慮していないように見えます。 –