배워서좀알자 님이 쓰신 글 :
: 인터베이스만 따로때어내서...이런 계시판이 있는 줄은..첨알았습니다..
: 모두들...수고하시구요....
: 다름이 아니라......
:
: 테이블 customs(거래처정보를 저장한 테이블), Datas(거래처의 거래내역을 저장한 테이블)
: 두테이블사이에는 customs의 code필드와 Datas의 Cust필드가 PK로..지정되어있습니다..
: 제가 원하는건 만약 사용자가 날짜조건을 "2002-05-10"일 부터 "2002-05-31"까지라고.지정했을때
: 거래처별 전잔액,매출액,수금액,현잔액을 쿼리로 추출하고 싶습니다.
: 그래서 아래 쿼리문으로
: //참고 ( datas.good는 상품코드입니다.. 상품코드가 ']'로 시작하면 수금, 아니면 매출 )
:
: select code,name,bl,tel1,
: (select sum(amou) from datas where (datas.cust=customs.code) and (datas.good not like "]%") and (datas.fdate < "2002-05-10")) bin, //"2002-05-10"일 전까지의 매출금액합계
: (select sum(amou) from datas where (datas.cust=customs.code) and (datas.good starting with "]") and (datas.fdate < "2002-05-10")) bou, //2002-05-10일 전까지의 수금금액합계
: (select sum(amou) from datas where (datas.cust=customs.code) and (datas.good not like "]%") and (datas.fdate between "2002-05-10" and "2002-05-31")) tin,//기간중 매출금액합계
: (select sum(amou) from datas where (datas.cust=customs.code) and (datas.good starting with "]") and (datas.fdate between "2002-05-10" and "2002-05-31")) tou //기간중 수금금액합계
: from customs
: 이렇게 하면..결과가 나오기는 하는데.......결과볼려면....잠이 밀려듭니다.(날씨탓인가??)
: 한숨자고 일어나도 될정도네요.....
: 뭔가 다른 방법을 써야될것같은데....우찌해야될까요....
: //참고2 (datas의 거래레코드수는 대략 100만 정도로..추산됩니다..)
: 혹시 다른 방법이 없을까요?? 부탁드립니다..
서브 쿼리는 조인보다 작성하기는 쉽지만,
일종의 중첩된 반복문이므로 상당히 느립니다.
위와 같이 하면 무려 100만 * 400만 만큼의 연산이 필요하지요.
다음과 같이 조인으로 바꾸면 500만 만큼의 연산만 필요합니다.
SELECT code, name, bl, tel1,
sum(bin_datas.amou) bin, sum(bin_datas.amou) bou,
sum(tin_datas.amou) tin, sum(tou_datas.amou) tou
FROM datas
JOIN cust ON datas.cust = customs.code
JOIN datas bin_datas ON datas.cust = bin_datas.cust
JOIN datas bou_datas ON datas.cust = bou_datas.cust
JOIN datas tin_datas ON datas.cust = tin_datas.cust
JOIN datas tou_datas ON datas.cust = tou_datas.cust
WHERE (bin_datas.good NOT STARTING ']' AND bin_datas.fdate < "2002-05-10")
AND (bou_datas.good STARTING ']' AND bou_datas.fdate < "2002-05-10")
AND (tin_datas.good NOT STARTING ']' AND tin_datas.fdate BETWEEN '2002-05-10' AND '2002-05-31')
AND (tou_datas.good STARTING ']' AND tou_datas.fdate BETWEEN '2002-05-10' AND '2002-05-31')
(참고: SQL 키워드를 대문자로 쓰면 괄호를 적게 써도 코드의 가독성이 높아집니다.)
|