3

私はこの問題を抱えていますが、SASでは。この質問で提供されている例を使用するために、名前の5つの列(name_1、name_2など)があり、名前が頻度の降順でリストされているリストを出力したいと思います。

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

上記の質問に答えて、「procsql;」で囲みました。および「終了;」:

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.

SAS9.2を使用しています。

考え?助けてくれてありがとう!

4

3 に答える 3

4

2 番目の列を参照するように ORDER BY 式を変更するだけです。また、COUNT 式の結果を SAS 変数名 (おそらく "freq") に割り当てることもお勧めします。

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; 

ORDER BY 2 DESC参考までに: 相対的な参照を与えるとも言えます。

于 2012-08-13T18:18:57.910 に答える
2

Proc SQLでは、順でcount(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;

列参照ができると思います。

于 2012-08-13T18:15:53.877 に答える
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;
于 2012-08-18T04:13:26.617 に答える