我在尝试引用宏变量时遇到语法问题。
我有一个ID号的子集和一个由IDnum关联的定量变量xxx的数据集:
data IDnumlist;
input IDnum;
cards;
123
456
789
;
run;
data info;
input IDnum xxx;
cards;
123 2
123 5
456 3
789 1
789 4
555 9
;
run;
我想总结一下info数据集中的数据,但不是IDnum = 555,因为那不在我的子集中。所以我的数据集看起来像这样:
IDnum xxx_count xxx_sum
123 2 7
456 1 3
789 2 5
到目前为止,这是我的尝试:
proc sql noprint;
select count(*)
into :NObs
from IDnumlist;
select IDnum
into :IDnum1-:IDnum%left(&NObs)
from IDnumlist;
quit;
proc sql;
create table want as
select IDnum,
count(xxx) as xxx_count,
sum(xxx) as xxx_sum
from info
where IDnum in (&IDnum1-IDnum%left(&NObs))
group by 1;
run;
我做错了什么?
答案 0 :(得分:2)
为什么要使用宏变量?这是连接的用途,或子查询,或谁知道有多少其他更好的方法来执行此操作。
proc sql;
create table want as
select info.idnum, count(xxx) as xxx_count, sum(xxx) as xxx_sum
from info inner join idnumlist
on info.idnum=idnumlist.idnum
group by info.idnum;
quit;
上述代码中的具体问题是您不能像使用数据步骤列表那样使用“宏变量列表”。理论上你可以单独列出它们,但更好的方法是选择不同的方式。
proc sql noprint;
select IDnum
into :IDnumlist separated by ','
from IDnumlist;
quit;
然后所有值都在& idnumlist中。并且可以直接与in运算符一起使用:
where idnum in (&idnumlist.)