为什么在运行随附的proc sql代码时出现SAS错误

时间:2019-04-18 16:56:31

标签: sql sas

我无法理解为什么在运行以下代码时出现以下错误:

在27处(FC_ATTORNEY_ID,REC_CHNG_DT)在                                 _                                 79 错误79-322:期望(。

35)AND REC_CHNG_CD In('A','C') 36;            _            79 错误79-322:期待a。

proc sql;

create table test as
SELECT DISTINCT 
FC_ATTORNEY_ID, FC_ATTORNEY_NM, REC_CHNG_DT
FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
WHERE (FC_ATTORNEY_ID, REC_CHNG_DT) IN
(
SELECT
FC_ATTORNEY_ID
, MAX (REC_CHNG_DT) AS LST_DT
FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
WHERE  REC_CHNG_CD In ('A','C')
GROUP BY FC_ATTORNEY_ID
) AND REC_CHNG_CD In ('A','C')
;quit;

试图避免我描述的两个错误。我从另一个程序员那里收到了这段代码,但是他们使用的是TOAD,而不是SAS

3 个答案:

答案 0 :(得分:0)

您的T_FORCLOSUREFROM语句中有两次WHERE

一个带有表标识符,另一个不带表标识符。

删除冗余代码以解决您的问题

答案 1 :(得分:0)

问题是这种语法:

(FC_ATTORNEY_ID, REC_CHNG_DT) IN ....

您不能以这种方式使用IN运算符。您只能将其用于单个值,而不能用于某些类型的复合对象。

有效语法类似于您的其他用法:

REC_CHNG_CD IN ('A','C') 

REC_CHNG_CD IN (select code_var from ....) 

如果您确实需要测试值的元组是否存在,请重新编码查询以使用EXISTS。

但是看起来您只是在要求最大日期。

create table test as
  SELECT FC_ATTORNEY_ID, FC_ATTORNEY_NM, max(REC_CHNG_DT) as REC_CHNG_DT
  FROM RDX_BDE.T_FORECLOSURE T_FORECLOSURE
  WHERE  REC_CHNG_CD In ('A','C')
  GROUP BY FC_ATTORNEY_ID, FC_ATTORNEY_NM
;

答案 2 :(得分:0)

您正在为每个律师选择记录了最新更改日期的行。

一种更简单的方法是在自动合并的组聚合上使用HAVING子句

proc sql;
  create table test as
  SELECT DISTINCT 
    FC_ATTORNEY_ID, FC_ATTORNEY_NM, REC_CHNG_DT
  FROM
    RDX_BDE.T_FORECLOSURE
  WHERE
    REC_CHNG_CD IN ('A','C')
  GROUP BY
    FC_ATTORNEY_ID
  HAVING 
    REC_CHNG_DT = MAX (REC_CHNG_DT)
  ;