将SAS MACRO扩展到多个字段

时间:2015-05-14 21:32:21

标签: sas sas-macro

我有一个受“PROC SQL by Example”启发的宏,它根据单个列/字段找到重复的行:

data have ; 
input name $ term $; 
cards;
Joe   2000 
Joe   2000 
Joe   2002
Joe   2008 
Sally 2001
Sally 2003
; run; 

%MACRO DUPS(LIB, TABLE, GROUPBY) ; 
  PROC SQL ; 
  CREATE TABLE DUPROWS AS 
   SELECT  &GROUPBY, COUNT(*) AS Duplicate_Rows
   FROM &LIB..&TABLE
    GROUP BY &GROUPBY
     HAVING COUNT(*) > 1 
    ORDER BY Duplicate_Rows; 
QUIT; 
%MEND DUPS ;

%DUPS(WORK,have,name) ; 
proc print data=duprows ; run; 

enter image description here

我想扩展它以查找基于多列(在我的示例中为第1行和第2行)的重复项,但仍然足够灵活以处理单个列。

在这种情况下,它将运行代码:

proc sql ; 
create table duprows as select name,term,count(*) as Duplicate_Rows
from work.have
group by name,term
HAVING COUNT(*) > 1
;quit;

生产:

enter image description here

1 个答案:

答案 0 :(得分:2)

要包含任意数量的字段以进行分组,您可以在groupby宏参数中列出所有字段,但列表必须以逗号分隔并由%quote()包围。否则SAS会看到逗号,并认为您提供了更多的宏参数。

因此,在您的情况下,您的宏调用将是:

%dups(lib = work, table = have, groupby = %quote(name, term));

由于&groupbyselect子句中包含group by,因此列出的所有字段都将显示在输出中,并将用于分组。这是因为当&groupby结算时,它会成为文本name, term