SAS Group通过数值或转换为char

时间:2013-08-02 15:50:19

标签: sas

我有以下数据:

data have;
       input username $  betdate : datetime. customerCode;
       dateOnly = datepart(betdate) ;
       format betdate DATETIME.;
       format dateOnly ddmmyy8.;
       datalines; 
        player1 12NOV2008:12:04:01 1
        player1 04NOV2008:09:03:44 10
        player2 07NOV2008:07:03:33 1 
        player2 05NOV2008:09:00:00 0.5 
        player3 05NOV2008:09:05:00 1
        player2 07NOV2008:14:03:33 1 
        player1 05NOV2008:09:00:05 20
        player2 07NOV2008:16:03:33 1 
        player2 07NOV2008:18:03:33 1 
        player2 09NOV2008:10:05:10 0.7
        player3 15NOV2008:15:05:33 10 
        player3 15NOV2008:15:05:33 1
        player2 15NOV2008:15:05:33 0.1
    run;
    PROC PRINT; RUN;

当我运行以下内容时,我没有获得customerCode的明显折叠条目,因为它是数字的,我推测。

    proc sql;
         select username, customerCode from have group by 1,2;
    quit;

我该怎么做?我想获得已分配给客户的所有客户代码的历史记录(即更改时),而不是customerCode的每个数值的条目。我无法将变量转换为char值,以便分组起作用:

proc sql;
     create table want as 
     select * from have, customerCode FORMAT $10. as code;

退出;

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

您没有获得明确的条目,因为它忽略了您的group by,因为您没有要求任何摘要功能。 SAS不允许group by没有摘要功能(即sum(something)count(something)或其他),它会将其转换为order by。没有明确的理由数字不适用于分组。

顺便提一下,这在日志中注明了NOTE

您可以按照评论中的建议使用distinct

proc sql;
select distinct username, customercode from have;
quit;

这将为您提供所有用户名/客户代码组合的列表。

如果你想格式化它,你必须删除$ - $ in格式并不意味着“使这个字符成为”,这就是所有格式的作用;它的意思是“原始值预格式是一个字符值”。

proc sql;
     create table want as 
     select distinct username, customercode format=10. from have;
quit;

这将无法按预期工作,因为在处理了distinct之后应用了格式(并且后小数部分仍然存在,只是在引擎盖下)。但是,您可以这样做:

proc sql;
     create table want as 
     select distinct username, put(customercode,10.) from have;
quit;

或者你可以使用ROUND或其他东西来保持数字。