Muchos de los que llegan a programar con SAS son grandes expertos en SQL. Cuando dominas perfectamente un lenguaje, es difícil acostumbrarse a otro. Por ello, quiero plantear un artículo que estudie los tipos de uniones mediante pasos DATA y su análogo con el PROC SQL. Con ello espero que los profesionales que manejan el lenguaje SQL entiendan mejor el paso DATA. En mi línea habitual, creo dos datasets y manejo ejemplos.
data uno;
input anio importe;
cards;
2000 100
2001 200
2002 300
2003 350
2004 375
2005 450
;
run;
data dos;
input anio importe2;
cards;
2003 550
2004 775
2005 650
2006 900
2007 450
;
run;
Las formas de unir conjuntos de datos SAS son:
Uniones verticales
Concatenación:
data tresA;
set uno dos;
run;
proc sql;
create table tresB as
select * from uno
outer union corr
select * from dos;
quit;
Intercalación:
data cuatroA;
set uno dos;
by anio;
run;
proc sql;
create table cuatroB as
select * from uno
outer union corr
select * from dos
order by anio;
quit;
Uniones horizontales
Total (Full Join):
data cincoA;
merge uno dos;
by anio;
run;
proc sql;
create table cincoB as
select coalesce(a.anio, b.anio) as anio,
a.importe,
b.importe2
from uno a full join dos b
on a.anio = b.anio;
quit;
Excluyentes:
Están en ambas tablas (Inner Join):
data seisA;
merge uno (in=en_uno) dos (in=en_dos);
by anio;
if en_uno and en_dos;
run;
proc sql;
create table seisB as
select a.anio, a.importe, b.importe2
from uno a inner join dos b
on a.anio = b.anio;
quit;
Están en la tabla de la izquierda (Left Join):
data sieteA;
merge uno (in=en_uno) dos (in=en_dos);
by anio;
if en_uno;
run;
proc sql;
create table sieteB as
select a.anio, a.importe, b.importe2
from uno a left join dos b
on a.anio = b.anio;
quit;
Están en la tabla de la derecha (Right Join):
data ochoA;
merge uno (in=en_uno) dos (in=en_dos);
by anio;
if en_dos;
run;
proc sql;
create table ochoB as
select coalesce(a.anio, b.anio) as anio,
a.importe,
b.importe2
from uno a right join dos b
on a.anio = b.anio;
quit;
No he comentado los ejemplos porque son bastante claros. Como veis, en SQL es muy importante el orden en el que se nombran las variables; por eso para algunos ejemplos empleamos COALESCE o CASE. Sin ello, el resultado no sería el esperado, ya que nos tomaría la variable anio del primer dataset que aparece en la SELECT; para el resto, nos pondría valores perdidos.
En el terreno profesional, se emplea mucho la INNER JOIN y la LEFT JOIN, fundamentalmente cuando unimos dos datasets con índices y deseamos prescindir de ordenaciones previas por ser muy costosas. Si trabajamos con uniones de más de dos datasets, recomiendo trabajar con MERGE. Es habitual partir de una tabla base y añadirle información de otras en un paso DATA final.
Por supuesto, si tenéis dudas o más sugerencias… rvaquerizo@analisisydecision.es. Saludos.