혼자 책으로 공부 중인데요.
스키마가 상품(상품코드,상품명)
거래내역(거래일자,거래번호,상품코드,수량)
와 같을 때
Q) 2010년 상반기 중 상품별 판매수량을 구하는 질의를 구하라(outer join을 이용하고 판매실적이 없는 경우 '0'으로 표시)
select 상품.상품코드 ,sum(거래내역.수량)as '상반기판매합계'
from 상품 natural left outer join 거래내역
group by 상품.상품코드
;
이와 같이 작성하면 2010년 상반기가 아닌 전체가 되구요
이때 실적이 없는 tuple은 상반기판매합계에 NULL로 나오지만요... 0은 아닙니다..
select 상품.상품코드 ,sum(거래내역.수량)as '상반기판매합계'
from 상품 natural left outer join 거래내역
where 거래내역.거래일자 between 20100101 AND 20100630
group by 상품.상품코드
;
이제 이러면 실적없는 tuple이 표시가 안되네요
문제는 알겠는데 해결 방법이 떠오르지 않습니다.
많은 도움 부탁드립니다 ㅠ
Comment 7
-
나는짱이야
2014.08.11 09:12
-
이리
2014.08.11 09:24
ISNULL(sum(거래내역.수량), 0)
-
초짜해커
2014.08.11 09:28
상품과 거래내역을 LEFT OUTER JOIN 했을때
거래가 없는 상품의 거래일자는 NULL로 나타납니다.
근데 WHERE 절에서 거래일자로 비교를 하셨네요.
그래서 안나오는 겁니다.
거래일자 비교를 JOIN절에서 하시는것도 하나의 방법입니다.
-
옹기종기
2014.08.12 02:31
죄송한데 위에서 하신 말씀들을 전혀 이해 하지 못하겠습니다......
조금 더 자세한 설명 부탁드립니다 .....ㅠㅠㅠ
-
건우아빠
2014.08.12 10:17
이퀄조인 일때는 on절 where절에 쓰셔도 동일한 결과를 나타 내지만..
아웃조인 일때는 전혀 다른 결과를 가져옵니다.
on절에 기술하면 해당 조건에 맞는 값을 가지고 아웃조인을 걸게 되구요.
where절에 기술하면 아웃조인된 결과를 필터링하게 됩니다..
그러므로 where절의 조건문을 on절에 기술하시면 됩니다.
-
옹기종기
2014.08.14 21:41
select 상품.상품코드 ,sum(B.수량)as '상반기판매합계'from 상품 natural left outer join (select * from 거래내역 where 거래일자 between 20100101 and 20100630) as Bgroup by 상품.상품코드;
도움 덕분에 여기까지 했고 isnull만 하면 되겠네요....감사합니다! -
옹기종기
2014.08.14 21:51
isnull 이 아니라 ifnull 사용해서 해결했습니다.
select 상품.상품코드 ,ifnull(sum(B.수량),0)as '상반기판매합계'
from 상품 natural left outer join (select * from 거래내역 where 거래일자 between 20100101 and 20100630) as B
group by 상품.상품코드
;
아래와 같이하면 되네요
isnull사용해서 0으로 replace시키면 되는거 아닌지요?