我试图在宏定义的%do循环中获取数组的第i个项,并使用元素名称创建数据集,但是我所能获得的只是“ z1”之类的东西。这就是我的目的到目前为止
%macro print(set,groupvar);
proc sql ;
select put(count(distinct &groupvar),1.)
into :hm
from &set
;
select distinct set
into :z1-:z&sysmaxlong
from &set
;
quit;
data %do i =1 %to &hm;
%scan(&z, &i);
%end;
;
%mend;
我也尝试使用z [&i]而不是%scan(&z,&i)
,但还是没有运气
答案 0 :(得分:0)
问题:
您有一个宏变量SET,但是在选择查询中有不同的SET,这是您想要的吗?
select distinct set
创建宏变量时,无需指定序列的结尾。
select distinct &set into :z1- from &set; quit;
您创建了一系列宏变量Z1-Zn,但是尝试使用SCAN来检索值吗?它们没有存储在数组中,而是存储在一系列宏变量(例如Z1,Z2等)中。
答案 1 :(得分:0)
output
语句无法指定动态目标表。您将需要创建墙纸代码,以根据拆分条件将其输出到适当的表。
您的宏将需要创建宏变量以支持此代码模板
data &out1 &out2 … &outN;
set input_data;
select;
when (&case1) output &out1;
when (&case2) output &out2;
…
when (&caseN) output &outN;
otherwise;
end;
run;
一些精巧的SQL可以支持模板
data &outlist;
set input_data;
select;
&whenStatements;
otherwise;
end;
run;
哈希对象.output()方法可以指定用于保存哈希内容的动态目标。考虑“将表拆分为名称基于变量值的子表”的情况,又称为“将一个数据集拆分为根据组变量命名的多个数据集”。有些方法需要对数据进行预先分析(如您发布的代码中一样),而其他方法则不需要。
https://www.devenezia.com/downloads/sas/samples/hash-6.sas处有一些基于散列的拆分器代码
您可以在sas社区找到其他数据拆分器。
答案 2 :(得分:0)
如果您想使用%scan()
,则只需创建一个宏变量。
select distinct set
into :z separated by ' '
from &set
;
%let hm=&sqlobs;
DATA
语句将在第一个分号处结束。但是您正在生成&hm+1
分号,而不只是一个。从%do
循环中删除虚假的分号。
data
%do i =1 %to &hm;
%scan(&z, &i)
%end;
;