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;