sql sas sas-macro

SAS proc sql dentro de% macro



sas like sql (2)

En primer lugar, tengo la siguiente tabla:

data dataset; input id $ value; datalines; A 1 A 2 A 3 A 4 B 2 B 3 B 4 B 5 C 2 C 4 C 6 C 8 ; run;

Me gustaría escribir una macro para que el usuario pueda subconjunto de los datos al dar el valor de identificación. Hago proc sql dentro de la macro de la siguiente manera:

%macro sqlgrp(id=,); proc sql; create table output_&id. as select * from dataset where id = ''&id.'' ; quit; %mend; %sqlgrp(id=A); /*select id=A only*/

Puedo generar la tabla output_A en la biblioteca WORK, pero tiene cero (0) observaciones.

¿Por qué esto no funciona?


Debe usar comillas dobles cuando se refiera a variables macro.

Código actual

%macro sqlgrp(id=,); proc sql; create table output_&id. as select * from dataset where id = ''&id.'' ; quit; %mend; %sqlgrp(id=A); /*select id=A only*/

Busca valores de id que son literalmente ''& id''. Puede probar esto creando este conjunto de datos:

data dataset; input id $ value; datalines; &id. 2 A 2 ; run;

Ahora, use %let para establecer el valor de la variable de macro id :

%let id=A;

Ejecute una prueba rápida de la diferencia de funcionalidad entre comillas simples y dobles. Tenga en cuenta que los títulos también contienen comillas simples y dobles, por lo que podemos ver exactamente lo que sucedió en el resultado:

proc sql; title ''Single Quotes - where id=&id.''; select * from dataset where id=''&id.''; title "Double Quotes - where id=&id."; select * from dataset where id="&id."; title; quit;

Código correcto

%macro sqlgrp(id=,); proc sql; create table output_&id. as select * from dataset where id = "&id." ; quit; %mend; %sqlgrp(id=A); /*select id=A only*/

Las comillas dobles permiten que la macrovariable y el id se resuelvan en ''A'', lo que arrojará resultados basados ​​en su entrada.


Solo una simple reescritura de la respuesta anterior que pasa ''in'' y ''out'' a través de una firma de las macros

%macro sqlgrp(in=, id=, out=); proc sql noprint; create table &out. as select * from &in. where id = "&id."; quit; %mend sqlgrp;