2016-07-13 2 views
0

DBA가 아니기 때문에 문제가 발생하기에 충분하다는 것을 알고 있습니다. 데이터 집합에서 날짜 차이를 찾으려고하지만 상태 변경을 기반으로 레코드 간의 조건부 차이 만 합산합니다. 내가 가지고있는 문제는 내가 필요로하는 규칙에 근거하여 며칠을 세지 않고있는 것입니다.SQL 합계 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

    나는 성공적으로 할 수 없었다. tranID 순으로 orderNum 레코드의 각 그룹을 검사해야하므로 orderNum 8과 같은 상황을 포착 할 수없는 것 같습니다. 마지막 두 트랜잭션은 작업 한 시간을 추가하지 않지만 네 번째 작업은 세 번째 작업을 추가합니다. 내가 예상했던 것 같은 결과를 낼 수있는 사람이 있다면 내가 잘못 가고있는 곳을 배우고 싶을 것입니다. –

    +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를 자체 조인의 비교 지점으로 고려하지 않는 것 같습니다. –