首页 > 解决方案 > 在 WHEN-DO 语句 SAS 中创建一个变量

问题描述

想要根据 prod 的值创建 2 个宏变量“list”和“list2”,但它总是返回最后一次迭代值。

谢谢

%let prod=WC;
SELECT ;

  WHEN (WC = &prod)
    DO; 
        %let list = (60 , 63 ); 
        %let list2= ("6A","6B","6C") ;
    END;

  WHEN (MT = &prod)
    DO;
        %let list = (33 , 34);
        %let list2= ("3A","3B");
    END;

OTHERWISE;

END;

RUN;
``

标签: sassas-macro

解决方案


宏处理器在生成的代码传递给 SAS 进行解释之前工作。因此,您的代码按以下顺序评估:

%let prod=WC;
%let list = (60 , 63 ); 
%let list2= ("6A","6B","6C") ;
%let list = (33 , 34);
%let list2= ("3A","3B");
data ...
SELECT ;
  WHEN (WC = &prod) DO; 
  END;
  WHEN (MT = &prod) DO;
  END;
  OTHERWISE;
END;
...
RUN;

要从正在运行的数据步骤设置宏变量,请使用 CALL SYMPUTX() 函数。另外,您是否真的想将变量 WC 与变量 MT 进行比较?您的数据步骤中的数据是否甚至具有这些变量?还是您想将文本 WC 与文本 MT 进行比较?

when ("WC" = "&prod") do;
  call symputx('list','(60,63)');
  call symputx('list2','("6A","6B","6C")') ;
end;

推荐阅读