在 PROC SQL 中按格式化变量分组

Group by a formatted variable in PROC SQL

我试图在 PROC SQL 中按自定义格式的变量进行分组,但到目前为止还没有找到解决方案。日志没有错误(如 summary statistic error here)并且所有代码均有效。这是一个简单的例子:

DATA have;
    INPUT value1;
    DATALINES;
1.22
0.99
0.22
4.00
9.99
;
RUN;

PROC FORMAT;
    value valuefmt
        low-.99="Below .00"
        1-5="-5.00"
        5-high="Above .00";
RUN;

DATA have;
    set have;
    FORMAT value1 valuefmt.;
RUN;

PROC SQL;
    SELECT count(*), value1 from have group by value1;
QUIT;

PROC SQL returns 按原始值(value1)而非格式化值分组的计数:

               value1
~~~~~~~~~~~~~~~~~~~~~
       1  Below .00
       1  Below .00
       1  -5.00    
       1  -5.00    
       1  Above .00

SAS 通过 FREQ 或 TABULATE 允许使用此功能。示例:

PROC TABULATE data=have;
    CLASS value1;
    TABLE value1;
RUN;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|                value1                |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|Below .00 |  -5.00   |Above .00 |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
|     N      |     N      |     N      |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
|        2.00|        2.00|        1.00|
-~~~~~~~~~~~~-~~~~~~~~~~~~-~~~~~~~~~~~~-

关于如何使用 PROC 执行类似操作的任何想法 SQL?

一种方法是在 GROUP BY 子句中使用 PUT() 函数。您可以 return 格式化值。

proc sql;
  select count(*) as N
       , put(value1,valuefmt.) as CharacterValue
  from have
  group by 2
  ;
quit;

否则,如果您想 return 原始类型中的值,则需要添加像 MIN() 这样的聚合函数。您还需要 re-apply 格式。

proc sql;
  select count(*) as N
       , min(value1) as Formmatted format=valuefmt.
       , min(value1) as Raw
  from have
  group by put(value1,valuefmt.)
  ;
quit;

结果

   N   Formmatted       Raw
-------------------------------
   2  -5.00          1.22
   1  Above .00      9.99
   2  Below .00      0.22