如何在SAS SQL中引用数字命名的变量?求助解决语法错误
解决SAS SQL中数字列名的识别问题
你遇到的问题核心是SAS默认不允许纯数字作为列名(标识符不能以数字开头)。当你通过PROC TRANSPOSE把DIM_TIME_ID(值为201912、202006这类数字)转成列名后,后续SQL中引用t1.&End_PRV_YEAR时,SAS会把t1.201912判定为语法错误——因为它无法识别数字开头的列名。
下面给你两种直接可行的解决方法:
方法1:在TRANSPOSE时给数字列名添加前缀
最简单的思路是给转置后的数字列名加一个合法前缀(比如YRM_),让列名变成YRM_201912、YRM_202006这类符合SAS命名规则的格式。修改后的完整代码如下:
%let PRV_MONTH = %sysfunc(intnx(month,%sysfunc(today()), -1,same),YYMMN.); %let End_PRV_YEAR = %sysfunc(intnx(year,%sysfunc(today()), -1,e),YYMMN.); PROC SQL; CREATE TABLE WORK.RESULT AS SELECT t2.DIM_TIME_ID, t1.AGENCY, Sum(t2.STACK) as OWN_STACK FROM xy.SALES t1, xy.STACK t2 WHERE (t1.DIM_SALES_ID = t2.DIM_SALES_ID AND t2.DIM_TIME_ID IN (&End_PRV_YEAR,&PRV_MONTH)) GROUP BY t2.DIM_TIME_ID,t1.AGENCY ORDER BY t1.AGENCY ASC; QUIT; -- 新增PREFIX参数,给转置后的列名添加前缀 PROC TRANSPOSE DATA=WORK.RESULT OUT=horizontal PREFIX=YRM_; BY AGENCY; ID DIM_TIME_ID; QUIT; PROC SQL; CREATE TABLE WORK.QUERY_FOR_HORIZONTAL AS SELECT t2.AREA, t2.DISTRICT, t1.AGENCY, -- 引用时对应加上前缀 t1.YRM_&End_PRV_YEAR, t1.YRM_&PRV_MONTH FROM WORK.HORIZONTAL t1 INNER JOIN xy.SALES t2 ON (t1.AGENCY = t2.AGENCY); QUIT;
方法2:用带n修饰符的引号包裹数字列名
如果你不想修改列名格式,可以在SQL引用数字列名时,用双引号包裹列名并加上n修饰符,明确告诉SAS这是一个合法标识符。修改后的最后一段SQL代码如下:
-- 先确保系统选项支持任意格式的变量名(如果没开启的话) OPTIONS VALIDVARNAME=ANY; PROC SQL; CREATE TABLE WORK.QUERY_FOR_HORIZONTAL AS SELECT t2.AREA, t2.DISTRICT, t1.AGENCY, -- 用"列名"n的格式引用数字列名 t1."&End_PRV_YEAR"n, t1."&PRV_MONTH"n FROM WORK.HORIZONTAL t1 INNER JOIN xy.SALES t2 ON (t1.AGENCY = t2.AGENCY); QUIT;
两种方法都能解决你的问题,更推荐第一种——带前缀的列名更直观,也能避免后续其他操作中可能遇到的标识符兼容问题。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

