Equivalencias entre PROC SQL y DATA en las uniones de tablas SAS
Agosto 12th, 2009 | por rvaquerizo |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

6 Respuestas en “Equivalencias entre PROC SQL y DATA en las uniones de tablas SAS”
Por ffernandez, Ago 18, 2009 | Responder
No conocía el outer union corr. La verdad es que yo me he acostumbrado a utilizar el método que más intuitivo me resulta en cada caso, y en algunos no conocía el equivalente en el otro método. Hoy precisamente me he llevado una sorpresa cuando he comprobado el funcionamiento del caso “Están en la tabla de la izquierda” cuando hay duplicados:
data uno;
anio=1;importe=2;output;
anio=1;importe=3;output;
anio=1;importe=4;output;
run;
data dos;
anio=1;importe2=5; output;
anio=1;importe=6; output;
run;
y ejecutar de nuevo los joins.
Por rvaquerizo, Ago 25, 2009 | Responder
A ver si tengo tiempo y hago un pequeño análisis de espacio y tiempo con varios tipos de uniones.
Después de haber trabajado con 1.000 profesionales de SAS distintos (por lo menos) me he dado cuenta de que el SQL no se emplea mucho a excepción de aquellos que vienen del PL.
A mi particularmente me gusta emplear el SQL porque se entiende mejor y, en ocasiones, es necesario migrar procesos de SAS a Oracle, DB2, Informix,.. y es mejor migrar código SQL.
Por Victor, Sep 10, 2009 | Responder
Hola,chicos. Tengo una duda epro no es sobre este tema. Estoy intentando importar una tabla en excel pero no lo consigo. Pongo este codigo:
proc export data=Tabla1
DBMS=Excelcs
OUTFILE=’C:Victor\Tabla.xls’ replace;
SERVER=”xxx.xx.xx.xx”;
PORT=yyyy;
VERSION=’2000′;
SHEET=”Hoja1″;
run;
Pero me da errores de escritura pero no se cual es. Gracias
Por Victor, Sep 10, 2009 | Responder
Perdon, el codigo es este:
proc import datafile = “C:\Victor\Tabla.xls”
OUT=kk;
DBMS=Excelcs
SERVER=’xxx.xx.xx.xx’;
PORT=yyyy;
VERSION=’2000′;
SHEET=’Hoja1′;
run;
Por rvaquerizo, Sep 10, 2009 | Responder
Creo que estás intentando importar una tabla de tu PC a un servidor. Es probable que no puedas hacer FTP y de ahí el error.
¿Haces FTP habitualmente?
Por Victor, Sep 14, 2009 | Responder
Si, tengo la tabla en el servidor y estaba intentando importarla,pero ya lo conseguí. El código es el siguiente:
proc import DBMS=excelcs
datafile = ‘C:\victor\tabla.xls’
OUT=work.tabla1;
SERVER=”xxx.xx.xx.xx”;
PORT=yyyy;
SHEET=”Hoja1″;
run;
Me he dado cuenta de que los proc import y export dan errores si se colocan las opciones de cierta manera.
Espero que sirva de ayuda este ejemplo