SAS SQL循环输入顺序文件

时间:2016-10-13 21:32:31

标签: sql loops input sas do-loops

我有: 6个文件,命名如下:" ROSTER2008"," ROSTER2009",...," ROSTER2013" 每个文件都有以下变量:TEAMID和MATE1,MATE2,...,MATEX。队友的名字存储在每个团队中,直到队友X.

现在:我想循环读取6个文件的代码并使用TEAM,MATES2008,MATES2009,...,MATES2013创建一个输出文件,其中MATES20XX变量包含各个团队中各个队友的数量一年(我不再关心他们的名字)。

以下是我尝试过的事情:

%macro sqlloop(start, end);
proc sql;
     %DO year=&start. %TO &end.;
         create table mates_by_team_&year. as 
         select distinct put(teamID, z2.) as team,
         count(*) as mates
         from myLibrary.rosters
         where d='ROSTER(HOW DO I PUT YEAR HERE?)'.d;
     %end;
quit;
%mend;

%sqlloop(start=2008, end=2013)

所以,这是我的问题:

  1. 如何修复'其中'语句使它理解我打算在每次迭代时引入的文件名? (那是ROSTER2008,......,ROSTER2013)

  2. 现在,我为我输入的每个文件创建了6个不同的表。相反,如何将这些文件连接到一个表中,如上所述?

  3. 提前感谢您的帮助!

    Xtina

2 个答案:

答案 0 :(得分:2)

为了简单起见,我假设您 MATEX 中的 X 永远不会超过999.显然您可以增加限制,或者您可以使用 proc内容或字典表,以找出最大限制。

我已将数据中的所有变量Mate1:​​MateX拉出来并检查它们是否缺失,并增加计数器以计算团队成员的数量。

%macro loops(start=,end=);

%do year=&start. %to &end.;
data year_&year.(keep=teamid Mates_&year.);
set roster&year.;
array mates{*} mate1-mate999;
Mates_&year.=0;
do i=1 to 999;
if not missing(mates{i}) then Mates_&year.=Mates_&year.+1;
end;
run;

proc sort data=year_&year.;
by teamid;
%end;

最后,我将所有数据集合并在一起。

data team;
merge year_&start.-year_&end.;
by teamid;
run;

%mend;

%loops(start=2008,end=2009);

答案 1 :(得分:0)

假设这些是SAS数据集,而您使用的是SAS 9.3+,我建议使用数据步骤和proc freq方法。它更容易理解。如果你想让它成为一个宏,用宏变量取代年份(2008/2012)。

编辑:添加N()以计算队友的数量,假设它遵循mate1 mate2 ... matex。 单个datastep可以得到答案,您可以删除变量。

Data combined;
Set roster2008 - roster2012 indsname=source;

 Year = substr(scan(source, 2, '.'), 7);

 Num_mates = n(of mate:); 

 *drop mate:;

 Run;

 PROC sort data=combined;
 By teamid year;
 Run;

 PROC transpose data=combined out=want prefix=mate;
 By teamid;
 VAR num_mates;
  Id year;
  Run;

  *OLD CODE BASED ON SQL SOLUTION;
 *Proc freq data=combined;
    *Table dsn*teamid/list;
  *Run;