Equivalencias entre PROC SQL y DATA en las uniones de tablas SAS
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 dataset 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:
_
data cincoA;
merge uno dos;
by anio;
run;
proc sql;
create table cincoB as select
case
when a.anio is null then b.anio
else a.anio end as anio,
*
from uno a full join dos b
on a.anio = b.anio;
quit;
Excluyentes:
Están en ambas tablas:
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
*
from uno a, dos b
where a.anio = b.anio;
quit;
proc sql;
create table seisC as select
*
from uno a inner join dos b
on a.anio = b.anio;
quit;
Están en la tabla de la izquierda:
data sieteA;
merge uno (in=en_uno) dos (in=en_dos);
by anio;
if en_uno;
run;
proc sql;
create table sieteB as select
*
from uno a left join dos b
on a.anio = b.anio;
quit;
Están en la tabla de la derecha:
data ochoA;
merge uno (in=en_uno) dos (in=en_dos);
by anio;
if en_dos;
run;
proc sql;
create table ochoB as select
case
when a.anio is null then b.anio
else a.anio end as anio,
*
from uno a right join dos b
on a.anio = b.anio;
quit;
No he comentado los ejemplos porque son bastante claros. Como véis en SQL es muy importante el orden en el que se nombran las variables por eso para algunos ejemplos empleamos el CASE, si él 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, probad los ejemplos sin el case y entenderéis porque lo empleo. En el terreno profesional comentaros que se emplea mucho la INNER JOIN y la LEFT JOIN fundamentalmente cuando unimos 2 datasets con índices y deseamos prescindir de ordenaciones previas por ser muy costosas. Si trabajamos con uniones de más de 2 datasets recomiendo trabajar con MERGE. Es habitual partir de una tabla base y añadirla información de otras en un paso DATA final. Por supuesto si tenéis dudas, más sugerencias o un empleo que me permita estar más tiempo con mi familia que pronto pasará a ser numerosa estoy en rvaquerizo@analisisydecision.es