Chapter 3. Combining Tables Horizontally Using PROC SQL - (2) - USING INNER JOINS


INNER JOIN SYNTAX

Inner join과 Outer join 두 방법이 있다고 하고요. 이번 포스팅은 INNER JOIN에 대해 설명하고자 합니다. 



INNER JOIN은 위 그림처럼, 서로 교집합부분을 말하는데요. 

합치려고 하는 데이터테이블 중에서, 첫번째 테이블의 행과 매치되는 값을 두번째 데이터테이블에서 찾아서 그것만 아웃풋으로 보여달라는 내용입니다. 이때 어떤 값이 매치될지는 WHERE구문에서 조건절을 넣어줘야겠죠. 이때 syntax는 다음과 같습니다.



바로 예문으로 보도록 하죠. 

FROM구문에서 불러오고자 하는 데이터를 지정하고요. ONE, TWO라는 데이터테이블을 불러와서, WHERE구 보면, WHERE one.x = two.x 즉 one이라는 데이터의 x라는 열 이름과 two라는 데이터의 x라는 이름이 같은 경우를 조건으로 걸었네요. 조건이 없는 경우 Cartesian product (그 전 포스팅 참고하세요)로 3^2 = 9개의 행이 출력되어야하지만, where조건을 걸었기때문에 이 조건에 해당하는 것만 결과값으로 나오게 됩니다. 이때 X라는 열의 값이 2라는것만 one과 two에 있기때문에 이 값만 출력하게 됩니다. 


다행이도 one / two 데이터테이블의 X라는 열의 이름이 같지만 달라도 상관 없습니다. 예를들어 테이블 1에서는 id라는 열의 이름으로 가진것과 테이블 2에서는 empid라는 열의 이름으로 가진것들의 값이 같을 경우라는 조건을 걸려면~ 

WHERE TABLE1.id = TABLE2.empid 라고 적으면 됩니다. 


이때 결과값은 한줄로만 나와있지만 사실 프로세스는 다음과 같아요. Cartesian product방법으로 모든 조합의 행들이 만들어지고요. 그 다음 한줄 (row)마다 where 구의 조건이 만족하는지 확인하게 됩니다. 이때 where 구문의 조건이 만족되지 않으면 제거되어서 제거되지 않은 최종값이 결과값이 되어 출력하게 됩니다. 


* Eliminate & Duplicate Columns 


결과값을 다시 봅시다. 열의 이름이 X, A, X, B이렇게 되어있네요. 왜냐하면 SELECT * 라고 지정했기때문에 모든 열의 값을 보여달라는 의미였고 그래서 X값이 중복되어 나타나게 되는겁니다.  


중복된 열의 이름을 제거하고 싶다면!! 

SELECT구문에서 다음처럼 지정해주면 됩니다. one.X 즉 one이라는 데이터테이블의 X라는 열의 이름과, a, b, 라는 열읭 ㅣ름이라고 따로 이름을 지정해주면 되는거죠. 혹은 SELECT one.*, b 이렇게 지정해줘도 됩니다. 결과값은 둘 다 같아요. 




열의 이름을 바꾸고 싶다면~!!  

만약 열의 이름을 바꾸고 싶다!!할땐 as 새로운이름, 이렇게 지정해주면 되는데요. 

아래 코드보면 one.x as ID, two.x, a, b, 이렇게 콤마를 기준으로 4개가 지정이 되었기때문에 결과값은 4개의 열이 나오게 됩니다. 


같은 값을 가진 행만 출력하고 싶다면!!   

아래 그림처럼 THREE라는 데이터테이블과 FOUR라는 데이터테이블이 있는데 X라는 열의 이름의 값 중에서 같은 값만 가진것만 출력하고자 합니다. 그럼 다음처럼 코드를 적을 수 있는데요. SELECT *라고 했으니 두개 데이터테이블의 열의 이름이 나 나오겠죠. 그래서 결과값은 아래 그림과 같습니다. 


예) Complex PROC SQL Inner Join  

SASUSER 라이브러이에 Staffmaster라는 데이터테이블엔, EmpID, LastName, FirstName, State가

SASUSER 라이브러리에 Payrollmaster라는 데이터테이블엔, EmpID, JobCode, DateOfBirth라는 열이 있다고 합시다. 


뉴욕에 살고있는 직원의 이름(First Initial, Last Name),  Jobcodes, age 데이터를 만들고자 할때 (이때 15개의 행만 보도록 합시다) 어떻게 하면 되는지 살펴보아요. 이름, Jobcode, 나이 이렇게 세개의 열을 만들고자 하는거거요. Jobcode만 Payrollmaster에 있네요? 


출력된 아웃풋그림부터 살펴보면 다음과 같아요. Name이른 열 이름에선 이름의 첫번째 글자에 . (period) 점을 찍어놓고 성을 적어놓았고요. Age는 태어난 연도와 올해 계산된 값이 들어간거겠어요. 




SELECT구에서 as Name, job code, as Age 이렇게 적은걸 보니 세개의 열을 만들고자 하고요. 

substr이라는 기능을 통해 firstname이라는 열의 1, 즉 첫번째 글자에서 1개만 불러오고 거기에 .(period)점을 찍은 뒤에 따옴표가 바로오지 않고 공백 있고 따옴표가 있는거 보니 점 찍고 한 칸 띄고요. 그리고 성을 붙이네요(||). 


Int함수는 integer그러니까 소숫점 없는 숫자가 나오는데, 오늘날짜(today())에서 태어난날을 빼서 그걸 365일로 나눠주면 해(year)가 나올텐데 소숫점으로 나올테니 소숫점을 없애주려고 int함수를 쓴거고요. 


where구문보면 payrollmaster의 empid와 staffmaster데이터의 empid가 같아야하고 그리고(AND) state가 NY일때만 걸러줘야겠지요. 그래서 코드는 다음과 같습니다. 




다음 포스팅엔 cutter join에 대해 살펴보도록 하죠. 

# SAS 자격증, SAS advanced, SAS advanced programming, SAS PREP GUIDE, 자격증 

반응형

+ Recent posts