Suip 테이블이 custno(고객번호), spldate(거래일자), itemno(품번)...........로 되어 있다고 하고
작년에 거래하다가 올해는 거래없는 고객번호를 찾고자합니다
select distinct CustNo from Suip where YEAR(Spldate)=2012
and not exists ( select custno from Suip where YEAR(Spldate)=2013 )
로 하니 결과가 없네요. 좀 가르쳐 주십시오
Comment 4
-
항해자™
2013.05.28 23:28
-
건우아빠
2013.05.28 23:39
항해자님의 아웃조인 방법외
1. not exists 를 쓰실려면 해당 고객이 2013에 있는지를 검색하셔야 합니다.
( select custno from Suip where YEAR(Spldate)=2013 ) 의 자료가 한건도 없다면 나오겠지만 한건이라도 있으면 안나오게 됩니다.
select distinct a.CustNo
from Suip a
where YEAR(a.Spldate)=2012
and not exists ( select custno
from Suip
where YEAR(Spldate)= 2013
and CustNo = a.CustNo )2. not in 으로 하시면 2013에 있는 고객은 제외 하고 2012년 고객을 가져오라는 의미가 됩니다...
select distinct CustNo
from Suipwhere YEAR(a.Spldate)=2012
and CustNo not in ( select custno
from Suip
where YEAR(Spldate)= 2013 )3.추가로 outer apply도 있습니다.
-
길주석
2013.05.29 06:11
항해자님 감사합니다.
건우아빠 대장님께 또 도움을 받았습니다.
늦은 시각에 정성스레 답글 주셔서 감사드립니다
네가지 경우가 모두 제가 원했던 답입니다.
outer join은 왠지 어렵고
보기에 쉽기는 not in의 방법이 좋을 듯한데
어디선가 듣기로는 in보다는 exists를 쓰라는 것 같던데 그런지요?
재삼 감사드립니다. 즐거운 하루되세요
-
길주석
2013.05.29 06:21
한개의 테이블을 두개인 것처럼 a와 b로 불러서 쓰는 법을 배웠습니다.
둘 중 하나 사용하시면 되겠네요,,,
SELECT DISTINCT A.custNo
FROM dbo.Suip AS A
LEFT JOIN dbo.Suip AS B
ON A.custNo = B.custNo
AND YEAR(B.SplDate) = 2013
WHERE B.custNo IS NULL
AND YEAR(A.SplDate) = 2012
SELECT DISTINCT A.custNo
FROM dbo.Suip AS A
LEFT JOIN (
SELECT DISTINCT custNo
FROM dbo.Suip
WHERE YEAR(SplDate) = 2013
) AS B
ON A.custNo = B.custNo
WHERE B.custNo IS NULL
AND YEAR(A.SplDate) = 2012