我有以下数据:
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;
退出;
感谢您提供任何帮助。
答案 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或其他东西来保持数字。