宏变量在Proc SQL中创建宏变量时生成空间

时间:2013-09-26 11:22:02

标签: macros sas

我正在创建一个宏变量,但是当我在Proc Report中使用相同的宏变量时,这个宏会在值前面生成一个空格

选择COUNT(DISTINCT USUBJID)为:来自DMDD的N1,其中ARMN = 1; enter image description here 我如何用相同的代码纠正它?

4 个答案:

答案 0 :(得分:6)

这实际上是按照设计工作的#39; for PROC SQL SELECT INTO。虽然所有其他答案在某些方面都是正确的,但这是一个特殊情况,而不是正常的宏变量,例如

%let var=          5       ;
%put [&var];

只会返回

  

[5]

虽然这不是那样做的。这是PROC SQL SELECT INTO的行为,是故意的。

这两个陈述:

proc sql;
 select name into :name from sashelp.class where name='Alfred';
 select name into :shortname separated by ' ' from sashelp.class where name='Alfred';
quit;
%put `&name` `&shortname`;

不相同。除非包含separated by ' ',否则notrim(或其他任何其他分隔符)将始终自动修剪,如果您有9.3或更新版本,则会有一个新选项trimmed,如果你打算选择一个变量。我认为这种行为是在9.2中引入的(默认情况下,非修剪选择没有分隔符。)

如果您只选择一个值,添加separated by ' '除了导致修剪外,不会对您的结果产生影响。

答案 1 :(得分:4)

这是因为任何宏变量都存储为字符。如果源数据是数字,则SAS使用best12。格式转换为字符,因此结果填充前导空格。我通过使用CATS功能来消除前导和尾随空白。您不能使用LEFT或STRIP函数,因为它们只能用于字符变量。

Select cats(COUNT(DISTINCT USUBJID)) into: N1 from DMDD where ARMN=1; 

答案 2 :(得分:2)

答案 3 :(得分:0)

Select trim(put(COUNT(DISTINCT USUBJID), 16. -L)) into: N1 from DMDD where ARMN=1;

使用PUT()使用-L(左)对齐格式化输出字符串。