将 SAS MACRO 扩展到多个字段

Extend SAS MACRO to multiple fields

我有一个受 "PROC SQL by Example" 启发的宏,它根据单个 column/field 查找重复行:

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; 

我想扩展它以查找基于多列的重复项(在我的示例中为第 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;

生产:

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

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

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

由于 &groupby 包含在 selectgroup by 子句中,所有列出的字段都将出现在输出中并将用于分组。这是因为当 &groupby 解析时,它变成文本 name, term.