SAS/SQL动态排序变量
我试图以一种特定的方式组织一个数据集,其中包含一系列变化的变量。我遇到的问题是,我并不总是知道数据集中变量的实际数量。我以前用SAS/SQL动态排序变量,sql,sas,report,sql-order-by,Sql,Sas,Report,Sql Order By,我试图以一种特定的方式组织一个数据集,其中包含一系列变化的变量。我遇到的问题是,我并不总是知道数据集中变量的实际数量。我以前用procsql语句或者在变量列表是静态的data语句之后的RETAIN语句完成了这项工作 我的数据如下所示: APPNUM DATE REASON1 REASON2 REASON3 REASON4 NAME1 NAME2 NAME3 NAME4 123 1/1/2017 X Y Z A Jon Mary
procsql
语句或者在变量列表是静态的data语句之后的RETAIN
语句完成了这项工作
我的数据如下所示:
APPNUM DATE REASON1 REASON2 REASON3 REASON4 NAME1 NAME2 NAME3 NAME4
123 1/1/2017 X Y Z A Jon Mary Tom Suzie
APPNUM DATE REASON1 NAME1 REASON2 NAME2 etc
123 1/1/2017 X Jon Y Mary etc
APPNUM, DATE, NAME1...2...3..., REASON1...2...3...
我希望它看起来像这样:
APPNUM DATE REASON1 REASON2 REASON3 REASON4 NAME1 NAME2 NAME3 NAME4
123 1/1/2017 X Y Z A Jon Mary Tom Suzie
APPNUM DATE REASON1 NAME1 REASON2 NAME2 etc
123 1/1/2017 X Jon Y Mary etc
APPNUM, DATE, NAME1...2...3..., REASON1...2...3...
使用sql或retain语句很容易做到这一点。然而,我正在使用循环等将这些变量拉到一起,并且呈现的变量数量取决于我的输入数据。有些天可能有20个原因/名称实例,而有些天可能每个都有1个
我尝试了下面的代码来提取变量名列表,然后对APPNUM、DATE排序,最后按变量名的最后一位排序。即1,1,2,2,3,3-但我没有成功。列表存储正确-没有错误,但在解析&VARLIST的值时出现错误。他们没有按预期订购。有没有人尝试过并完成了这一点
PROC SQL;
SELECT NAME INTO :VARLIST SEPARATED BY ','
FROM DICTIONARY.COLUMNS
WHERE LIBNAME = 'WORK'
AND MEMNAME = 'SFINAL'
ORDER BY NAME, SUBSTR(NAME,LENGTH(NAME)-1);
QUIT;
上述代码的顺序如下:
APPNUM DATE REASON1 REASON2 REASON3 REASON4 NAME1 NAME2 NAME3 NAME4
123 1/1/2017 X Y Z A Jon Mary Tom Suzie
APPNUM DATE REASON1 NAME1 REASON2 NAME2 etc
123 1/1/2017 X Jon Y Mary etc
APPNUM, DATE, NAME1...2...3..., REASON1...2...3...
而不是:
APPNUM, DATE, NAME1, REASON1, NAME2, REASON2....
两个问题
首先,您在orderby上的订单是反向的
其次,您的SUBSTR()
调用不正确。末尾有一个任意长度的数字。你不知道会有多少个字符。最好的方法是读取该数字字符串,将其转换为一个数字,然后按该数字排序
data test;
array name[20];
array reason[20];
format appnum best. date date9.;
run;
proc sql noprint;
SELECT NAME INTO :VARLIST SEPARATED BY ','
FROM DICTIONARY.COLUMNS
WHERE LIBNAME = 'WORK'
AND MEMNAME = 'TEST'
and (upcase(NAME) like 'NAME%' or upcase(NAME) like 'REASON%')
ORDER BY input(compress(compress(name,'name'),'reason'),best.), NAME ;
quit;
%put &varlist;
proc sql noprint;
create table test2 as
select APPNUM, DATE, &varlist
from test;
quit;
为什么顺序是倒序的?另外,我的SUBSTR没有错。。您只需执行长度-N,SAS将从该点到字符串的其余部分进行substr。即
数据测试;长度a$3;输入a;数据线;abc;跑proc-sql;创建新表,从测试中选择substr(a,长度(a)-0)作为a1;退出proc打印数据=新数据;运行
生成c
,但现在我向自己解释,这仍然不支持1&2个数字,您需要先按数字再按名称订购。否则,您将首先对所有名称进行分组,您希望首先按数字排序。试试上面的代码,它会满足你的要求。