CAFE

SQL Query Tips

LAG 함수 대신 Windowing 절 사용하기

작성자원쿼리맨|작성시간14.03.02|조회수478 목록 댓글 0

문제)


아래 inventory 테이블이 있다.

Itemcode InHand toShip

A002 500 50
A002 500 25
A003 800 10
A003 800 20
A004 250 30



다음과 같은 결과를 얻으려면?
(Status 는 NetQuantity가 0보다 크면 Ship, 그렇지 않으면 Can't Ship)


Itemcode InHand toShip NetQuantity Status

A002 500 50 450 Ship
A002 450 25 425 Ship
A002 425 10 415 Ship
A003 800 10 790 Ship
A003 790 20 770 Ship
A004 100 150 -50 Can'tShip



답변)


이런 비슷한 문제에 몇번 접한 적이 있다.

itemcode - inhand 한 결과를 다음 행으로 보내기 위해 LAG 함수를 사용해야 할 것이라는 생각이 먼저 든다.

하지만 이 경우, windowing 절을 적절히 사용하면, LAG 함수를 피할 수 있다.

답변 쿼리에서 windowing절에서 rows의 범위를 잡을때, 현재행을 제외하고 바로 윗 행까지를 범위로 잡은 것을 주의해서 보자.

꼭 다시 써먹게 될 것이다.



SELECT itemcode
     , inhand
     , toship
     , netquantity
     , DECODE (SIGN (netquantity), 1, 'Ship', 'Can''tShip') status
  FROM (SELECT itemcode
             ,   inhand
               - NVL
                    (SUM (toship) OVER (PARTITION BY itemcode ORDER BY itemcode
                    , ROWNUM ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) inhand
             , toship
             ,   inhand
               - SUM (toship) OVER (PARTITION BY itemcode ORDER BY itemcode
                , ROWNUM) netquantity
          FROM inventory)

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼