SAS中带PROC转置的列排序

SAS中带PROC转置的列排序,sas,Sas,我使用下面提到的代码在proc transpose之后对列进行动态排序。我已经为这个解决方案找到了很多解决方案。但是现在如果我跑的话,我会得到一个错误 data work.AB ; input name $ class $ dt $ gpa $; datalines; JOHN 1 201607 C- JOHN 1 201608 C+ JOHN 1 201702 B- JOHN 2 201608 A NICK 1 201608 A NICK 1 201707 A MIKE 2 201608 B

我使用下面提到的代码在proc transpose之后对列进行动态排序。我已经为这个解决方案找到了很多解决方案。但是现在如果我跑的话,我会得到一个错误

data work.AB ;
input name $ class $ dt $ gpa $;
datalines;
JOHN 1 201607 C-
JOHN 1 201608 C+
JOHN 1 201702 B-
JOHN 2 201608 A
NICK 1 201608 A
NICK 1 201707 A
MIKE 2 201608 B
MIKE 2 201607 B
MIKE 2 201707 B+
MIKE 2 201702 B
BOB 3 201702 D
BOB 3 201607 C
BOB 3 201707 C
;
proc sort data=work.AB;
by NAME ClASS dt;
run;

PROC TRANSPOSE DATA = AB OUT = ABC(drop=_name_) ;
BY nAME cLASS; 
VAR GPA;
ID dt; 
RUN ;

proc sql ;
create table test as 
select name into : list separated by ' '
from dictionary.columns
where libname='WORK' and memname='ABC'
order by input(substr(name,anydigit(name)),best32.)
;
quit;

%put &list;

data want;
retain &list;
set ABC;
run;
我得到的错误是

22 GOPTIONS ACCESSIBLE;
WARNING: Apparent symbolic reference LIST not resolved.
23 %put &list;
&list

24 data want;
25 retain &list;
_
22
200
WARNING: Apparent symbolic reference LIST not resolved.

ERROR 22-322: Syntax error, expecting one of the following: a name, ;, _ALL_, _CHARACTER_, _CHAR_, _NUMERIC_.
ERROR 200-322: The symbol is not recognized and will be ignored.

26 set ABC;
27 run;

请建议。

您不能将同一SELECT语句中的值同时放入数据集和宏变量中。从SQL代码中删除
create table test as

您还可能希望通过将查询更改为以下内容来抑制某些警告:

proc sql noprint ;
select case when (not anydigit(name)) then -1
            else input(substr(name,anydigit(name)),?32.)
       end as order
     , name
  into :list
     , :list separated by ' '
from dictionary.columns
where libname='WORK' and memname='ABC'
order by 1
;
quit;

%put &list;

不能将同一SELECT语句中的值同时放入dataset和宏变量中。从SQL代码中删除
create table test as

您还可能希望通过将查询更改为以下内容来抑制某些警告:

proc sql noprint ;
select case when (not anydigit(name)) then -1
            else input(substr(name,anydigit(name)),?32.)
       end as order
     , name
  into :list
     , :list separated by ' '
from dictionary.columns
where libname='WORK' and memname='ABC'
order by 1
;
quit;

%put &list;

您需要提供更多信息(大概是程序第一部分的日志)。不管出于什么原因,SQL SELECT INTO位都不起作用,但我们不知道为什么。我刚才提到了我得到的错误日志。休息吧,一切都很好。我无法找到解决上述错误的方法。也许您可以使用procsqlnoprint;从dictionary.columns(其中libname=WORK)和memname='ABC'按输入顺序(substr(name,anydigit(name)),best32.)中选择名称到:以“”分隔的列表中。退出;您需要提供更多信息(大概是程序第一部分的日志)。不管出于什么原因,SQL SELECT INTO位都不起作用,但我们不知道为什么。我刚才提到了我得到的错误日志。休息吧,一切都很好。我无法找到解决上述错误的方法。也许您可以使用procsqlnoprint;从dictionary.columns(其中libname=WORK)和memname='ABC'按输入顺序(substr(name,anydigit(name)),best32.)中选择名称到:以“”分隔的列表中。退出;嗨,汤姆,我也试过这么做。但我得到的错误与我在前面的查询中提到的相同。需要68个数据;69保留和列表;注意:由宏变量“LIST”生成的行。69类名称201607 201608 201702 201707 _______22 200错误22-322:语法错误,应为以下之一:名称;,全部,字符,字符,数字。错误200-322:符号无法识别,将被忽略。我无法解析,或者您的变量名不符合正常约定,因此您需要在查询中指定
nliteral(name)
。或者,您没有正确地将
指定到
子句中,并且在宏变量
列表
中输入了
顺序
的值,而不是
名称
的值。嗨,汤姆,我也尝试过这样做。但我得到的错误与我在前面的查询中提到的相同。需要68个数据;69保留和列表;注意:由宏变量“LIST”生成的行。69类名称201607 201608 201702 201707 _______22 200错误22-322:语法错误,应为以下之一:名称;,全部,字符,字符,数字。错误200-322:符号无法识别,将被忽略。我无法解析,或者您的变量名不符合正常约定,因此您需要在查询中指定
nliteral(name)
。或者,您没有正确地将
指定到
子句中,并且在宏变量
列表
中输入了
顺序
的值,而不是
名称
的值。。