如何处理 SAS 存储过程中的多个过滤器
How to handle multiple filters in SAS stored process
我正在创建一个 SAS 存储过程报表,用户可以在其中使用不同的自助餐厅过滤数据。
这就是我正在做的
%let ID_WHERE_CLAUSE=;
%let Source = "group";
%let ActionRequired = "Daily";
%macro SetFilters;
data _null_;
%if &&ActionRequired ne "A" %then %do;
%let test = "ActionR";
call symputx('ID_WHERE_CLAUSE',cats(' and ActionRequired = ',' &ActionRequired',''));
%end;
%if &&Source ne "A" %then %do;
%let test = "Source";
call symputx('ID_WHERE_CLAUSE',cats('and Source = ',' &Source',''));
%end;
run;
%mend; %SetFilters;
%put &ID_WHERE_CLAUSE;
in ID_WHERE_CLAUSE 数据应该是 and action required = "Daily" and source = "group"
但我的代码只是将最后一个过滤器附加到我的 ID_WHERE_CLAUSE
变量作为 and source = "group"
我的预期结果是and action required = "Daily" and source = "group"
但是实际结果我得到的是and source = "group"
这就是我没有得到预期结果的原因。如何在我的 ID_WHERE_CLAUSE
变量中附加所有 where 条件。
我也试过了,但也没用。
call symputx('ID_WHERE_CLAUSE',' and ActionRequired = &ActionRequired','');
call symputx('ID_WHERE_CLAUSE', ' and Source = &Source');
我将其用作
proc sql noprint;
create table filter_data as
select * from data
where 1=1 &ID_WHERE_CLAUSE;
quit;
请告诉我如何将所有 where 子句连接到它或任何更好的方法。
call symputx
不会附加到宏变量 - 它会覆盖它们。因此,您需要捕获现有值作为您要设置的新值的一部分。例如
call symputx('ID_WHERE_CLAUSE',cats(symget("ID_WHERE_CLAUSE"),'and Source = ',' &Source',''));
您需要在您的场景中使用symget
来执行此操作,而不是直接引用宏变量,否则它可能会在您之前的数据步骤执行并设置初始值之前解决。
我正在创建一个 SAS 存储过程报表,用户可以在其中使用不同的自助餐厅过滤数据。
这就是我正在做的
%let ID_WHERE_CLAUSE=;
%let Source = "group";
%let ActionRequired = "Daily";
%macro SetFilters;
data _null_;
%if &&ActionRequired ne "A" %then %do;
%let test = "ActionR";
call symputx('ID_WHERE_CLAUSE',cats(' and ActionRequired = ',' &ActionRequired',''));
%end;
%if &&Source ne "A" %then %do;
%let test = "Source";
call symputx('ID_WHERE_CLAUSE',cats('and Source = ',' &Source',''));
%end;
run;
%mend; %SetFilters;
%put &ID_WHERE_CLAUSE;
in ID_WHERE_CLAUSE 数据应该是 and action required = "Daily" and source = "group"
但我的代码只是将最后一个过滤器附加到我的 ID_WHERE_CLAUSE
变量作为 and source = "group"
我的预期结果是and action required = "Daily" and source = "group"
但是实际结果我得到的是and source = "group"
这就是我没有得到预期结果的原因。如何在我的 ID_WHERE_CLAUSE
变量中附加所有 where 条件。
我也试过了,但也没用。
call symputx('ID_WHERE_CLAUSE',' and ActionRequired = &ActionRequired','');
call symputx('ID_WHERE_CLAUSE', ' and Source = &Source');
我将其用作
proc sql noprint;
create table filter_data as
select * from data
where 1=1 &ID_WHERE_CLAUSE;
quit;
请告诉我如何将所有 where 子句连接到它或任何更好的方法。
call symputx
不会附加到宏变量 - 它会覆盖它们。因此,您需要捕获现有值作为您要设置的新值的一部分。例如
call symputx('ID_WHERE_CLAUSE',cats(symget("ID_WHERE_CLAUSE"),'and Source = ',' &Source',''));
您需要在您的场景中使用symget
来执行此操作,而不是直接引用宏变量,否则它可能会在您之前的数据步骤执行并设置初始值之前解决。