PROC SQL语法错误求助:ERROR 22-322与ERROR 76-322
SAS PROC SQL语法错误排查与修复
代码中的问题点:
- SELECT列表末尾多余逗号:
ADT6MoForAS,后面的逗号无效,SQL要求最后一列不能带逗号,这会直接触发语法错误。 - 错误的子查询逻辑:你想用子查询实现条件取值,但这里完全不需要子查询,改用
CASE WHEN表达式更合适。另外SAS中不需要用方括号[t2.EndDate]引用列,直接写列名即可。 - JOIN后的错误分号:
INNER JOIN ... ON (t2.PlayerId = t1.PlayerId);里的分号会提前终止SELECT语句,导致后面的WHERE子句变成独立的无效语句,这是ERROR 76-322的直接原因。 - 日期计算语法错误:
DATE(NOW() - INTERVAL 6 MONTH)是其他SQL方言的写法,SAS中计算6个月前的日期,用INTNX('MONTH', TODAY(), -6)才是正确语法。 - 日期字面量未转换:直接用
'03/20/2022'和日期列比较容易因系统格式设置出问题,建议用INPUT函数转换成标准SAS日期值。
修正后的代码:
PROC SQL; CREATE TABLE WORK.QUERY_FOR_VVW_DWH_PTN AS SELECT t1.PlayerId, t1.FirstName, t1.LastName, t1.Email, t2.EndDate, t2.Most_Recent_Overall_Experience, t1.AdtLifetimeRange AS AdtLifetimeRange1, CASE WHEN t2.EndDate <= INTNX('MONTH', TODAY(), -6) THEN t1.AdtLifetimeRange END AS ADT6MoBack, CASE WHEN t2.EndDate >= INTNX('MONTH', TODAY(), -6) THEN t1.AdtLifetimeRange END AS ADT6MoForAS FROM TDQT.vCXSurvey t2 INNER JOIN TDQT.vCXPlayer_SAS t1 ON (t2.PlayerId = t1.PlayerId) WHERE t2.EndDate < INPUT('03/20/2022', MMDDYY10.); QUIT;
内容的提问来源于stack exchange,提问作者rrmenon63089
相关产品推荐
相关产品推荐

