조인관련해서 질문이 있습니다. 0 3 8,955

by WOLF [SQL Query] [2020.11.24 08:54:08]


안녕하세요. 
질문이 있어서 글 남깁니다.
아래처럼 마스터에는 상품명과 가격이 있고, 가격변경 일자가 있습니다.
판매에는 실제 판매된 일자와 상품명이 있고요.

실제판매한 일자에 판매된 가격을 넣고 싶습니다.
10월 20일에 판매된 사과는 1000원이면 10월 23일에 판매된 사과는 1000원으로 표기하고, 
11월 10일 가격변경후 판매된 사과는 3000원, 11월 20일 이후에 판매된 사과는 2000원 이렇게
표기하려고 하는데 어떻게 표기하는게 좋을지 몰라서요.

참고할만한 팁이라도 얻고 싶어요.
 

with master as (
select '1000' code, '20201020' dt, '사과' nm from dual
union all select '3000', '20201110', '사과' from dual
union all select '2000', '20201120', '사과' from dual
union all select '300', '20201115', '배' from dual
union all select '200', '20201125', '배' from dual
),

sale as (
select '' code, '20201021' dt, '사과' nm from dual
union all select '', '20201115', '사과' from dual
union all select '', '20201125', '사과' from dual
union all select '', '20201122', '사과' from dual
union all select '', '20201121', '사과' from dual
union all select '', '20201123', '배' from dual
union all select '', '20201020', '사과' from dual
union all select '', '20201105', '사과' from dual
union all select '', '20201127', '사과' from dual
union all select '', '20201130', '배' from dual
union all select '', '20201020', '사과' from dual
union all select '', '20201105', '사과' from dual
union all select '', '20201116', '배' from dual
union all select '', '20201131', '사과' from dual
)

by 샤랄라 [2020.11.24 11:21:15]
select nm
     , dt
     , (select max(code) keep(dense_rank first order by dt desc)
        from master m
        where m.nm = s.nm
        and m.dt <= s.dt)
from sale s
order by nm, dt
;

 


by pajama [2020.11.24 11:36:34]

너무 어렵게 생각했군요..

select nm, sdt, code
from (
select s.nm, s.dt sdt, m.dt mdt, m.code, s.dt - m.dt, row_number() over (partition by s.rn, s.nm, s.dt order by (s.dt - m.dt)) rn1
from (select rownum rn, dt, nm from sale) s, master m
where s.dt >= m.dt and s.nm = m.nm
)
where rn1 = 1
order by nm, sdt


by WOLF [2020.11.24 13:07:06]

감사합니다. 이렇게 할 수 있군요. 큰 도움이 되네요!!

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