SAS / SQL动态排序变量

时间:2017-08-09 19:36:56

标签: sql sas report sql-order-by

我正在尝试以特定方式组织数据集,其中包含更改的变量列表。我遇到的问题是我并不总是知道我将在数据集中拥有的变量的实际数量。我之前使用PROC SQL语句或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

使用sql或retain语句会很容易。但是,我使用循环等将这些变量拉到一起,并且所呈现的变量数量取决于我的输入数据。有些日子里可能有20个REASON / NAME个体,其他的可能有1个。

我尝试使用以下代码来提取变量名称列表,然后订购APPNUM,DATE,最后按变量名称的最后一位排序。 I.E. 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, NAME1...2...3..., REASON1...2...3...

而不是:

APPNUM, DATE, NAME1, REASON1, NAME2, REASON2....

1 个答案:

答案 0 :(得分:1)

两个问题。

首先,ORDER BY上的订单是倒退的。

其次,您的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;