2014-03-19 2 views
-2

샘플 데이터는 다음과 같습니다. 필터 SQL 쿼리?


l16seqno | l16lcode | carrno | ecarrno | l16qty | reasoncode
32001 | 12 | 207620 | 370036873034035916 | 32 | 0
32269 | 12 | 207620 | 370036873034035916 | -32 | 800
39075 | 12 | 207620 | 370036873034035916 | 32 | 0
39074 | 12 | 207622 | 370036873034035923 | 32 | 0
32268 | 12 | 207622 | 370036873034035923 | -32 | 800
31999 | 12 | 207622 | 370036873034035923 | 32 | 0
32271 | 12 | 207624 | 370036873034035930 | -32 | 800
32005 | 12 | 207624 | 370036873034035930 | 32 | 0
39077 | 12 | 207624 | 370036873034035930 | 32 | 0

테이블 Z02T1의 모든 이벤트 로깅이 있습니다. 언제든지 l16lcode = 12 - 팔레트를 차단 또는 차단 해제하고 있습니다. 팔레트를 막을 때 feild는 음수이고 차단을 해제하면 양수입니다.

이유 코드는 Z02T2 테이블에서 찾을 수 있습니다 (각 로그 레코드의 고유 일련 번호 인 l16seqno로 Z02T1에 연결할 수 있음).

Z14T1 테이블에는 팔레트 - 팔레트 번호에 대한 정보가 들어 있습니다.

내가 가장 가까운 다음 레코드를 찾을 때 차단 해제 코드 0

이 내 목표는 ... 코드 (800)와 차단 된 경우

즉 각각의 팔레트 두 줄을 찾는 것입니다 ... 그리고 이유 코드 0 인이 팔레트에 대한 l16lcode = 12 (이유 코드 800 인이 팔레트에 대한 레코드가있는 경우).

내가 만든 초기 쿼리는 다음과 같습니다

select Z02T1.datreg, Z02T1.l16seqno, Z02T1.l16lcode, Z02T1.divcode, Z02T1.carrno, 
     Z14T1.ecarrno, Z02T1.l16qty, Z02T2.reascode from Z02T2 
inner join Z02T1 on Z02T1.l16seqno=Z02T2.l16seqno 
left outer join Z14T1 ON Z14T1.carrno=Z02T1.carrno 
where Z02T1.l16lcode=12 
and (Z02T2.reascode=800 or Z02T2.reascode=0) 
order by Z14T1.ecarrno 

내가 reasoncode으로 다음 reasoncode 800 매우 다음 레코드로 하나 개의 레코드를 얻기 위해이 쿼리를 변경할 수있는 방법 같은 ecarrno feild가 0 ? 여기

+0

이 SQL Server OR oracle입니까? PL/SQL 제거 태그가 없습니다. – OldProgrammer

+0

SQL 서버 용 – Hansen

+0

@Hansen - SS 버전은 무엇입니까? –

답변

0

는 기존 쿼리를 수정하는 데 사용할 수있는 몇 가지 샘플 코드입니다.

이 예제는 reasoncode=800 기록보다 l16seqno 더있다 reasoncode=0의 첫 번째 occurance에 reasoncode=800 다음 서브 필터의 첫 번째 occurance에 필터주의하십시오.

CREATE TABLE reasons (
    l16seqno int NOT NULL, 
    carrno int NOT NULL, 
    reasoncode int NOT NULL 
); 

INSERT INTO reasons 
    (l16seqno, carrno, reasoncode) 
VALUES 
    (1, 1, 0), 
    (2, 1, 800), 
    (3, 1, 0), 
    (10, 300, 0), 
    (11, 300, 800), 
    (12, 300, 0), 
    (13, 300, 800), 
    (14, 300, 0), 
    (1003, 1212, 0), 
    (1004, 1212, 800), 
    (1005, 1212, 0), 
    (1006, 1212, 0); 

WITH cte1 (l16seqno, carrno, reasoncode, rownumber) 
AS 
(
    SELECT l16seqno, carrno, reasoncode, ROW_NUMBER() OVER (PARTITION BY carrno, reasoncode ORDER BY l16seqno) 
    FROM reasons 
    WHERE reasoncode = 800 
), 
cte2 (l16seqno, carrno, reasoncode, rownumber) 
AS 
(
    SELECT r.l16seqno, r.carrno, r.reasoncode, ROW_NUMBER() OVER (PARTITION BY r.carrno, r.reasoncode ORDER BY r.l16seqno) 
    FROM reasons AS r 
    INNER JOIN cte1 AS c ON r.carrno = c.carrno 
    WHERE r.reasoncode = 0 AND r.l16seqno > c.l16seqno 
) 
SELECT r.l16seqno, r.carrno, r.reasoncode 
FROM reasons AS r 
LEFT OUTER JOIN cte1 AS c1 ON c1.l16seqno = r.l16seqno 
LEFT OUTER JOIN cte2 AS c2 ON c2.l16seqno = r.l16seqno 
WHERE c1.rownumber = 1 
OR c2.rownumber = 1 
ORDER BY r.carrno, r.l16seqno; 

여기에 나열된 샘플 코드 중 SQL Fiddle demo입니다.

이 정보가 도움이되기를 바랍니다.

+0

감사합니다 Laszlo .. 당신의 도움을 위해 ... 나는 그것을 작동하게하고 그것을 원하는 결과를 준다. 너무 잘됐다 :) – Hansen

0

당신은 이동 :

여기
;with cte as 
(
    Select l16seqno 
      ,l16lcode 
      ,carrno 
      ,ecarrno 
      ,l16qty 
      ,reasoncode 
      ,ROW_NUMBER() Over(Partition By ecarrno, reasoncode Order By l16seqno) rn 
    From MyTable 
) 
Select l16seqno 
     ,l16lcode 
     ,carrno 
     ,ecarrno 
     ,l16qty 
     ,reasoncode 
From cte 
Where rn = 1 
Order By ecarrno asc, reasoncode desc 
+0

답장을 보내 주셔서 감사합니다. Dave! 내가 그것을 시도하자 그리고 나서 당신에게 돌아갈 것입니다 – Hansen