2013-07-08 1 views
0

변경된 데이터 만 기록하고 다른 열은 NULL로 유지하는 응용 프로그램의 로깅 테이블이 있습니다. 내가 지금하고 싶은 것은 해당 열 (Type 및 Status) 중 2 개를 취하는 뷰를 작성하고 해당 로그 행의 항목에 유형 및 상태를 리턴하는 결과 세트를 작성하는 것입니다. 하나 또는 두 개의 컬럼 null도 가능. 이 데이터 예를 들어
2 개의 열의 필드를 결합하여 "매트릭스"를 만드는 방법은 무엇입니까?

: 거기에서

Type Status AddDt 

A 1  7/8/2013 
NULL 2  7/7/2013 
NULL 3  7/6/2013 
NULL NULL 7/5/2013 
B NULL 7/4/2013 
C NULL 7/3/2013 
C 4  7/2/2013 

produce the resultset: 
Type Status AddDt 
A 1  7/8/2013 
A 2  7/7/2013 
A 3  7/6/2013 
A 3  7/5/2013 
B 3  7/4/2013 
C 3  7/3/2013 
C 4  7/2/2013 

내가 유형 및 상태는 B의 유형으로 특정 조건을 충족 이러한 결과에서 처음으로 알아낼거야 및 상태 3 (2012 년 7 월 4 일)이며 궁극적으로 계산에서 해당 날짜를 사용하므로 실적이 큰 문제입니다. 여기

내가 지금까지 생각하고 있었는지,하지만 내가 할 필요가 어디 나를하지 않습니다 내가 필요한 곳 ​​아래에 제공된 도움으로 그래서

SELECT 
Type.TypeDesc 
, Status.StatusDesc 
, * 
FROM 
jw50_Item c 
OUTER APPLY (SELECT TOP 10000 * FROM jw50_ItemLog csh WHERE csh.ItemID = c.ItemID AND csh.StatusCode = 'OPN' ORDER BY csh.AddDt DESC) [Status] 
OUTER APPLY (SELECT TOP 10000 * FROM jw50_ItemLog cth WHERE cth.ItemID = c.ItemID AND cth.ItemTypeCode IN ('F','FG','NG','PF','SXA','AB') ORDER BY cth.AddDt DESC) Type 
WHERE 
c.ItemID = @ItemID 
, 내가 얻을 수있었습니다 . 현재의 데이터는 아마도 어떤 필요 조건을 충족하기 때문에

SELECT 
OrderID 
, CustomerNum 
, OrderTitle 
, ItemTypeDesc 
, ItemTypeCode 
, StatusCode 
, OrdertatusDesc 
FROM 
    jw50_Order c1 
    OUTER APPLY (SELECT TOP 1 [DateTime] FROM 
        (SELECT c.ItemTypeCode,  c.OrderStatusCode, c.OrderStatusDt as [DateTime] FROM jw50_Order c  WHERE c.OrderID = c1.OrderID 
        UNION 
        select (select top 1  c2.ItemTypeCode 
          from  jw50_OrderLog c2 
          where  c2.UpdatedDt >= c.UpdatedDt and c2.ItemTypeCode is not null and  c2.OrderID = c.OrderID 
          order by  UpdatedDt DESC 
          ) as type, 
          (select top 1  c2.StatusCode 
          from  jw50_OrderLog c2 
          where  c2.UpdatedDt >= c.UpdatedDt and c2.StatusCode is not null and  c2.OrderID = c.OrderID 
          order by  UpdatedDt DESC 
          ) as status, 
          UpdatedDt as  [DateTime] 

        from jw50_OrderLog c 
        where c.OrderID =  c1.OrderID AND (c.StatusCode IS NOT NULL OR c.ItemTypeCode IS NOT  NULL) 
        ) t 
        WHERE t.ItemTypeCode IN  ('F','FG','NG','PF','SXA','AB') AND t.StatusCode IN ('OPEN') 
        order by [DateTime]) quart 
WHERE quart.DateTime <= @FiscalPeriod2 AND c1.StatusCode =  'OPEN' 
Order By c1.OrderID 

노조는 결과 집합을 생성하는 로그 테이블 데이터에 추가하여 현재 데이터를 가져올 수 있습니다 : 여기 내 마지막 솔루션입니다. 도움을 주신 분들께 다시 한번 감사드립니다.

답변

1

를 제공하지 않기 때문에 나는 그것이 작동 할 것이라고 절대적으로 확신하지

는 상관 하위 쿼리를 사용하는 방법이다 :

당신이 jw50_item(AddDt, type)jw50_item(AddDt, status)에 인덱스가있는 경우
select (select top 1 c2.type 
     from jw50_Item c2 
     where c2.AddDt >= c.AddDt and c2.type is not null 
     order by AddDt 
     ) as type, 
     (select top 1 c2.status 
     from jw50_Item c2 
     where c2.AddDt >= c.AddDt and c2.status is not null 
     order by AddDt 
     ) as status, 
     (select AddDt 
from jw50_Item c 

, 그 성능은 꽤 좋은해야한다.

0

"기록 생성"이라고 가정합니다. 일부 데이터가 누락 된 날짜의 경우 다음 사용 가능한 데이터를 설정해야합니다.

Select i.AddDt, t.Type, s.Status 
from Items i 
join Items t on (t.addDt = 
    (select min(t1.addDt) 
    from Items t1 
    where t1.addDt >= i.addDt 
     and t1.Type is not null)) 
join Items s on (s.addDt = 
    (select min(s1.addDt) 
     from Items s1 
    where s1.addDt >= i.addDt 
     and s1.status is not null)) 

는 사실 내가 2 개 차 테이블에 기본 테이블에 합류하고있어 조건이 보조 테이블의 각 열이 null이 아닌 곳에 우리가 작은 행을 일치 조인 :

비슷한 작업을해야합니다 (물론 현재 날짜보다 작습니다). 나는 내 앞에있는 SQL 서버를 가지고 있지만 그것을 시도 : 여기

+0

문제는 제가 보조 테이블에서 원하는 행이 다른 열에 null 값을 가질 수 있다는 것입니다. Items s에 값이 있지만 Items t가 null이지만 Items s 앞에 입력 된 경우 Items s 행과 Items t 행 사이의 모든 행에 null을 제외하고 아무 것도 없으면 아무 것도없는 날짜가 필요합니다. 해당 행의 t가 null 인 경우에도 Items s 행이 추가되었습니다. "null을 제외하고는 모든 행 사이에 존재합니다"부분은 트릭입니다. 왜 내 질문에 먼저 결과 집합을 생성하고 그 집합에서 날짜를 찾으려고 했는가? –

+0

t1.addDt <= i.addDt 및 t1.Type이 null이 아닌 항목 t1에서 'select max (t1.addDt)'식은 현재 날짜 이전에 값이 마지막으로 설정된 * 날짜 *를 제공합니다. (null 값은 건너 뜁니다). 역순으로 필요할 수도 있습니다 (값을 설정 한 현재 날짜 또는 그 이후의 가장 작은 날짜). – gaborsch

관련 문제