/* proc sql을 쓰는 사람은 대부분 JOIN 즉 merge때문에 사용합니다.
1 .merge로는 2개밖에 합치지 못하는데 SQL JOIN은 10개이상까지 합칠수 있는 것 같습니다.
2. merge할 BY 변수로 sort할 필요도없고,
3. merge할 변수의 이름이 달라도 되고, 상당히 융통성있는 merge가 가능합니다.
*/
/* 데이터 u1, u2를 다음과 같이 만들죠 */
data u1;
input key $ value1 @@;
datalines;
A 11 B 12
;
data u2;
input key $ value2 @@;
datalines;
C 23 A 21
;
/*** full join을 이용해보죠. 다음과 같이 u1, u2를 key라는 변수로 JOIN합니다. ***/
proc sql;
select u1.*, u2.*
from u1
full join u2 on u1.key=u2.key
;quit;
/* u1.* u2.*라고 했으니 u1, u2에 있는 모든 변수를 다음과 같이 프린트합니다. 그런데 이게 원하는결과는 아니다. */
key value1 key value2
--------------------------------------
A 11 A 21
B 12 .
. C 23
/* 중요한 점은 */
select key, value1, value2 라고 하면 error입니다.
value1은 u1에 value2는 u2에 있어 괜찮지만, key는 두 데이터 모두에 있어 둘중 어떤것을 요구하는지 알수없습니다.
select m1.key, m1.value1, m2.value2 라고 할 수 있고
select m2.key, m1.value1, m2.value2 라고 할 수 있습니다. 물론 value1, value2의 m1, m2는 생략가능합니다.
그런데 m1에 있는 key와 m2에 있는 key를 합친 값을 원하면 아래와 같이 합니다.
/*** COALESCE(x1,x2)라는 함수를 사용하여 x1이 missing이면 x2의 값을 사용한다.***/
proc sql;
select coalesce(u1.key,u2.key) as key,
value1,
value2
from u1
full join u2 on u1.key=u2.key
;quit;
/* 원하는 결과가 나왔다. */
key value1 value2
----------------------------
A 11 21
B 12 .
C . 23
/*** full join외에 LEFT JOIN이 있는데, Clinical Trails에서는 데이터 특성상 LEFT JOIN만 사용했습니다. ***/
proc sql;
select coalesce(u1.key,u2.key) as key,
value1,
value2
from u1
left join u2 on u1.key=u2.key
;quit;
/* left join은 left에 있는 u1의 값을 중심으로 merge한다. */
key value1 value2
----------------------------
A 11 21
B 12 .
/*** RIGHT JOIN도 있다. ***/
proc sql;
select coalesce(u1.key,u2.key) as key,
value1,
value2
from u1
right join u2 on u1.key=u2.key
;quit;
/* left join은 right에 있는 u2의 값을 중심으로 merge한다. */
key value1 value2
----------------------------
A 11 21
C . 23