使用宏程序

Using a Macro Program

我正在尝试使用宏程序对前 10% GPA 的总 GPA 进行排序的记录结果是 24 个最高 GPA,它们的学分超过 60 个学分但少于 130 个学分。 下面是我的代码

%MACRO TopTen(outputtable, less, more);
PROC SQL;
select round(count(ID)/10) into :Data from OverallGPA;
quit;

%PUT &Data;

PROC SQL outobs=&Data.;
    Create table &outputtable. as select * 
    from OverallGPA,OverallCreditHoursEarned
    where &less.<OverallCreditHoursEarned<&more.
    order by ID
;
quit;

%MEND;

%TopTen(Report3, 60, 130);
/* creates report of number of values in top ten percent */
PROC REPORT data=Report3;
run;

此过程报告当前正在打印具有相同 ID TotalGPA 但不同的 OverallCreditHoursEarned 的列。 有什么想法可以使这项工作吗?我使用了我认为有效但不适用于宏的 Proc Rank。 Proc Rank代码如下。

   PROC RANK data=OverallGPA out=Report3Alt(where=(TopTenPercent<=24)) 
   descending ties=Low;
   var TotalGPA;
   ranks TopTenPercent;
   run;

您的 SQL 连接没有按照您的意愿进行。这个:

from OverallGPA, OverallCreditHoursEarned
where &less. <  OverallCreditHoursEarned < &more

这并没有告诉 SAS(或 SQL)将这两个 table 加入什么,所以它将 每个 table 中的每条记录加入到其他 table 中的每条记录。如果您在 1 table 中有 100 条记录,在另一个 table 中有 100 条记录,它将在输出 table 中产生 10,000 条记录。这不是你想要的。

首先,我强烈建议只使用 PROC RANK,因为这就是它的工作。您为 SAS 付费,在需要时使用 SAS。把它放在你有主 PROC SQL 加入的宏中。或者,使用 PROC RANK 中的 GROUPS 选项,它将您的记录分组为十分位数(或其他),并过滤输出数据集 WHERE GROUP=0 或适合您需要的任何内容。这可能有效:

PROC RANK data=OverallGPA out=Report3Alt(where=(TopTenPercent=0)) groups=10 
   descending ties=Low;
   var TotalGPA;
   ranks TopTenPercent;
   run;

但是,如果您想使用 SQL,请正确连接 - 要么使用带有 on 语句的显式连接,要么使用 ID 变量向您的 [=17 添加相等性=] 语句。我更喜欢使用 on 语句进行显式连接,例如

from OverallGPA inner join OverallCreditHours 
on OverallGPA.ID = OverallCreditHours.ID
where OverallCreditHours.OverallCreditHours between &less and &more

或同等学历。您可能需要左连接或右连接,我不清楚,但内连接似乎最有可能。