2015-05-14 111 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:很好,我很高興這對你有用。 –