In a previous posting we talked about joining SAS Datasets using the Data Step. This time around let’s talk about joining datasets using Proc SQL. We’ll work through 4 different examples to see how the DATA step and PROC SQL differ and which one works best in which situation.
One-to-One matches
WEIGHTS COLLECTED IN JANUARY 2013 (JAN2013)
ANIMAL | WT1 |
---|---|
1 | 14 |
2 | 18 |
3 | 20 |
WEIGHTS COLLECTED IN FEBRUARY 2013 (FEB2013)
ANIMAL | WT2 |
---|---|
1 | 21 |
2 | 30 |
3 | 37 |
Data weights_2013;
merge jan2013 feb2013;
by animal;
Run;
Proc sql;
select jan2013.animal, jan2013.wt1, feb2013.wt2
from jan2013, feb2013
where jan2013.animal = feb2013.animal;
Quit;
WEIGHTS_2013
ANIMAL | WT1 | WT2 |
---|---|---|
1 | 14 | 21 |
2 | 18 | 30 |
3 | 20 | 37 |
One-to-many matches
WEIGHTS COLLECTED IN JANUARY 2013 (JAN2013)
ANIMAL | WT1 |
---|---|
4 | 21 |
5 | 15 |
6 | 19 |
WEIGHTS COLLECTED IN FEBRUARY 2013 (FEB2013)
ANIMAL | WT2 |
---|---|
4 | 38 |
5 | 34 |
5 | 36 |
6 | 41 |
Data weights_2013;
merge jan2013 feb2013;
by animal;
Run;
Proc sql;
select jan2013.animal, jan2013.wt1, feb2013.wt2
from jan2013, feb2013
where jan2013.animal = feb2013.animal;
Quit;
WEIGHTS_2013
ANIMAL | WT1 | WT2 |
---|---|---|
4 | 21 | 38 |
5 | 15 | 34 |
5 | 15 | 36 |
6 | 19 | 41 |
Many-to-many matches
WEIGHTS COLLECTED IN JANUARY 2013 (JAN2013)
ANIMAL | WT1 |
---|---|
7 | 14 |
7 | 17 |
8 | 15 |
WEIGHTS COLLECTED IN FEBRUARY 2013 (FEB2013)
ANIMAL | WT2 |
---|---|
7 | 19 |
7 | 21 |
8 | 28 |
Data weights_2013;
merge jan2013 feb2013;
by animal;
Run;
Proc sql;
select jan2013.animal, jan2013.wt1, feb2013.wt2
from jan2013, feb2013
where jan2013.animal = feb2013.animal;
Run;
Data Step Resulting table
ANIMAL | WT1 | WT2 |
---|---|---|
7 | 14 | 19 |
7 | 17 | 21 |
8 | 15 | 28 |
Proc SQL Resulting table
ANIMAL | WT1 | WT2 |
---|---|---|
7 | 14 | 19 |
7 | 14 | 21 |
7 | 17 | 19 |
7 | 17 | 21 |
8 | 15 | 28 |
Non-matching
WEIGHTS COLLECTED IN JANUARY 2013 (JAN2013)
ANIMAL | WT1 |
---|---|
9 | 11 |
10 | 15 |
12 | 16 |
WEIGHTS COLLECTED IN FEBRUARY 2013 (FEB2013)
ANIMAL | WT2 |
---|---|
9 | 20 |
12 | 24 |
13 | 30 |
Data weights_2013;
merge jan2013 feb2013;
by animal;
Run;
Proc sql;
select jan2013.animal, jan2013.wt1, feb2013.wt2
from jan2013, feb2013
where jan2013.animal = feb2013.animal;
Run;
Data Step Resulting table
ANIMAL | WT1 | WT2 |
---|---|---|
9 | 11 | 20 |
10 | 15 | |
12 | 16 | 24 |
13 | 30 |
Proc SQL Resulting table
ANIMAL | WT1 | WT2 |
---|---|---|
9 | 11 | 20 |
13 | 16 | 24 |