2012-08-13 72 views
3

我有this問題,但在SAS。使用在這個問題中提供的例子中,我有名稱(NAME_1,NAME_2等)的5列,並要輸出其中名稱以頻率的降序排列的列表:SAS:選擇多列值的頻率

John  502 
Robert 388 
William 387 
... 
...  1 

我接受了上面提到的問題的答案,並用「proc sql」包圍它。和 「退出;」:

proc sql; 
create table freqs as 
SELECT name, COUNT(1) 
FROM (   SELECT name_1 AS name FROM mytable 
    UNION ALL SELECT name_2 AS name FROM mytable 
    UNION ALL SELECT name_3 AS name FROM mytable 
    UNION ALL SELECT name_4 AS name FROM mytable 
    UNION ALL SELECT name_5 AS name FROM mytable 
    ) AS myunion 
GROUP BY name 
ORDER BY COUNT(1) DESC 
; 
quit; 

但我得到:

ERROR: Summary functions are restricted to the SELECT and HAVING clauses only. 

我使用SAS 9.2。

想法?謝謝您的幫助!

回答

4

你只需要改變你的ORDER BY表達式來引用第二列。我也建議您在COUNT表達式的結果分配給一個SAS變量名(也許是「頻率」):

proc sql; 
    create table freqs as 
    SELECT name 
     , COUNT(*) as freq 
    FROM (
     SELECT   name_1 AS name FROM mytable 
     UNION ALL SELECT name_2 AS name FROM mytable 
     UNION ALL SELECT name_3 AS name FROM mytable 
     UNION ALL SELECT name_4 AS name FROM mytable 
     UNION ALL SELECT name_5 AS name FROM mytable 
    ) AS myunion 
    GROUP BY name 
    ORDER BY freq DESC; 
quit; 

FYI:您也可以說ORDER BY 2 DESC給相對引用。

2

Proc SQL不允許按順序計數(1)。試試這個:

proc sql; 
    create table freqs as 
     SELECT name, COUNT(1) as freqs 
     FROM (SELECT name_1 AS name FROM mytable UNION ALL 
       SELECT name_2 AS name FROM mytable UNION ALL 
       SELECT name_3 AS name FROM mytable UNION ALL 
       SELECT name_4 AS name FROM mytable UNION ALL 
       SELECT name_5 AS name FROM mytable 
      ) AS myunion 
     GROUP BY name 
     ORDER BY 2 DESC ; 
quit; 

我認爲它允許列引用。

0

下可能工作以及如果數據集不是太大:

data mytable; 
input (name1-name5) (: $17.) @@; 
cards; 
john henry bob jerry james gary bill john mark gabe 
; 
run; 

proc sql; 
select 'do name = ' 
||catq("A2SC", name1,name2,name3,name4,name5) 
||'; output; end;' into : nlist separated by ' ' from mytable 
; 
quit; 

data test; 
&nlist 
Run; 

proc freq order = freq; 
tables name; 
run;