2015-05-14 64 views
1

我具有由“通过实施例PROC SQL”,用于查找基于单个柱/场重复行启发宏:扩展SAS MACRO到多个字段

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

回答

2

要包含字段组上的任意号码,你可以列出他们都在groupby宏参数,但该列表必须用逗号分隔,并且由%quote()包围。否则SAS会看到逗号,并认为你提供了更多的宏参数。

所以你的情况,你的宏调用将是:

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

由于&groupby包括在selectgroup by条款,上市将出现在输出中,所有字段将被用于分组。这是因为&groupby解决时,它将成为文本name, term

+0

是的,我试图通过一个引用的字符串,并使用unquote。不过,我认为这很有效,并且会服务于我的目的。 –

+0

@WesMcClintick:很好,我很高兴这对你有用。 –