使用宏程序
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
或同等学历。您可能需要左连接或右连接,我不清楚,但内连接似乎最有可能。
我正在尝试使用宏程序对前 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
或同等学历。您可能需要左连接或右连接,我不清楚,但内连接似乎最有可能。