서브쿼리 초보 질문입니다. 0 3 977

by 임태원 [2017.01.05 12:46:44]


예를들어

 

지역      접수월      접수물량

부산          1월          10

부산          2월           20

부산          3월           30

 

ㅇ이런 테이블이 있을때

로우넘버를 써서.

 

지역      접수월      접수물량    RN

부산          1월          10         1

부산          2월           20         2

부산          3월           30         3

 

으로 rn을 넣었을경우.

 

지역      접수월      접수물량    전월물량

부산          1월          10           -

부산          2월           20         10

부산          3월           30         20

 

로우넘버를 서브쿼리를 이용하여 전월물량을 가져오고 싶습니다.

물론 전월이 없는경우 -를 넣구요..Rn = 1 일경우가 되겠죠..

쿼리로 구성이 어렵네요..ㅠ 초보지만 질문 남깁니다.

 

 

by jkson [2017.01.05 12:57:13]

이럴 때 쓰라고 있는 lag라는 window function이 있습니다.

with t as
(
select '부산' rgn, '1월' mon, '10' qty from dual union all
select '부산' rgn, '2월' mon, '20' qty from dual union all
select '부산' rgn, '3월' mon, '30' qty from dual
)
select rgn, mon, qty
     , nvl(lag(qty) over(partition by rgn order by mon),'-') bfqty 
from t 

 


by 우리집아찌 [2017.01.05 13:49:15]

-- join 으로 풀자면..
-- with 절은 jkson것 빌렸음

with t as
(
select '부산' rgn, '1월' mon, '10' qty from dual union all
select '부산' rgn, '2월' mon, '20' qty from dual union all
select '부산' rgn, '3월' mon, '30' qty from dual
) , a as (
  select t.*
       , row_number() over(partition by rgn order by mon) rn
    from t
)


select a.rgn "지역" , a.mon "접수월" , a.qty "접수물량" , nvl(b.qty,'-') "전월물량"
  from a a  left outer join a b 
         on  a.rgn  = b.rgn
        and  a.rn - 1  = b.rn  
   order by a.rgn , a.rn  


by 마농 [2017.01.06 10:56:47]

1. 접수월이
  - '1월', '2월' '10월' 형태로 가변 자리수로 저장되어 있으면 안될 듯 하네요.
  - 년월(yyyymm) 형태로 년도를 포한한 고정자리수로 저장되어 있어야 합니다.
  - 가변자리인 경우 정렬이 흐트러집니다.
2. 중간에 빈월이 있는 경우?
  - 전월의 범위를 어떻게 할지도 한정지어야 합니다.
  - 1월,2월 있고 3월이 없는데 4월이 있는경우.
  - 4월의 전월을 2월로 볼지? 3월로 볼지? 하는 부분.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입