수고하십니다. 조언을 얻고자 질문 올립니다.
test테이블로부터 관리점, 고객별로 가장 최근 월의 데이터를 추출해서
aaa 테이블로 insert를 하고자 합니다.
전체 고객을 대상으로 하니까 full scan을 해야 하는데,
아래와 같은 sql은 합계와 최근 월을 구하기 위해
동일한 테이블을 두 번이나 full scan하게 됩니다.
insert into aaa
select m.brno, m.custno, m.recym,
round(m.sum1/1000, 0), round(m.sum2/1000, 0),
round(m.sum3/1000, 0), round(m.sum4/1000, 0),
round((m.sum1 + m.sum2 + m.sum3 + m.sum4) / 1000, 0),
s2.....(생략)
from (select brno, custno, recym,
sum(rent1) sum1, sum(rent2) sum2,
sum(rent3) sum3, sum(rent4) sum4
from test
group by brno, custno, recym
) m .............................................................(1)
join
(select brno, custno, max(recym) recym
from test
group by brno, custno
) s1 .............................................................(2)
on m.brno = s1.brno
and m.custno = s1.custno
and m.recym = s1.recym
left outer join
...(이하 생략)
예를 들어, test테이블의 데이터는 아래와 같습니다.
brno custno recym kbn rent1 rent2 rent3 rent4
----------------------------------------------------------------
'0451', '00000001', '200709', '01', 1000000, 2000000, 3000000, 4000000
'0451', '00000001', '200709', '02', 1000000, 2000000, 3000000, 4000000
'0451', '00000001', '200708', '01', 1000000, 2000000, 3000000, 4000000
'0451', '00000001', '200708', '02', 1000000, 2000000, 3000000, 4000000
'0451', '00000002', '200703', '01', 1000000, 2000000, 3000000, 4000000
'0451', '00000002', '200703', '02', 1000000, 2000000, 3000000, 4000000
'0451', '00000002', '200702', '01', 1000000, 2000000, 3000000, 4000000
'0451', '00000002', '200702', '02', 1000000, 2000000, 3000000, 4000000
00000001 고객의 최근월은 2007년09월.
00000002 고객의 최근월은 2007년03월.
따라서, 원하는 결과는...
brno custno recym rent1 rent2 rent3 rent4 total
-----------------------------------------------------------
'0451', '00000001', '200709', 2000, 4000, 6000, 8000, 20000
'0451', '00000002', '200703', 2000, 4000, 6000, 8000, 20000
이 됩니다.
full scan을 1회만 하도록 (2)를 없애고, (1)을 아래와 같이 하면 결과가 잘못 나오네요.
from (select brno, custno, recym,
sum(rent1) sum1, sum(rent2) sum2,
sum(rent3) sum3, sum(rent4) sum4
from test
group by brno, custno, recym
having recym = max(recym)
) m
글이 길어졌네요.^^
자세하게 쓴다고 썼는데 잘 전달되었는지 모르겠습니다.
그러면 고수님들의 조언 부탁드리겠습니다.
|