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个数字,您需要先按数字再按名称订购。否则,您将首先对所有名称进行分组,您希望首先按数字排序。试试上面的代码,它会满足你的要求。