【问题标题】:Group by a formatted variable in PROC SQL按 PROC SQL 中的格式化变量分组
【发布时间】:2018-03-22 19:14:24
【问题描述】:

我正在尝试按 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 $1.00"
        1-5="$1-5.00"
        5-high="Above $5.00";
RUN;

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

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

PROC SQL 返回按原始值 (value1) 分组的计数,而不是格式化值:

               value1
~~~~~~~~~~~~~~~~~~~~~
       1  Below $1.00
       1  Below $1.00
       1  $1-5.00    
       1  $1-5.00    
       1  Above $5.00

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|                value1                |
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|Below $1.00 |  $1-5.00   |Above $5.00 |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
|     N      |     N      |     N      |
|~~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~~|
|        2.00|        2.00|        1.00|
-~~~~~~~~~~~~-~~~~~~~~~~~~-~~~~~~~~~~~~-

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

【问题讨论】:

    标签: sql sas proc-sql


    【解决方案1】:

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

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

    否则,如果您想返回原始类型的值,则需要添加一个聚合函数,如 MIN()。您还需要重新应用格式。

    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  $1-5.00          1.22
       1  Above $5.00      9.99
       2  Below $1.00      0.22
    

    【讨论】:

    • group by 2 是做什么的?第一个语句效果很好,你也可以使用group by calculated CharacterValue。谢谢!
    • 您可以通过变量在 GROUP BY 或 ORDER BY 子句中的 SELECT 语句的变量列表部分中的位置来引用变量。节省了大量的重新输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多