1

我有以下数据:

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;

当我运行以下命令时,当我按它进行分组时,我没有得到明确的折叠条目,因为它是数字,我想。

    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;

退出;

感谢您对此的任何帮助。

4

1 回答 1

0

您没有得到不同的条目,因为它忽略了您的group by, 因为您没有要求任何摘要功能。SAS 不允许group by没有汇总函数(即,sum(something)count(something)其他),它将其转换为order by. 没有明确的原因 numeric 不适用于分组。

顺便说一下,这在日志中用NOTE, 进行了说明。

正如您在评论中建议的那样,您可以使用distinct

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

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

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

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 或其他东西来保持数字。

于 2013-08-02T16:14:39.503 回答