如何使用 proc SQL 将新列添加到 SAS 中的数据集中?

How to add new column in to a dataset in SAS using proc SQL?

我正在尝试根据另一列的二进制条件向数据集添加新列。但是,我不断收到错误消息。我的代码如下:

proc sql;
alter table data
    add Status (case WHEN missing(DeactReason) THEN 'Active' ELSE 'Inactive)'
   END;
quit;

但是,我收到以下错误:

143  proc sql;
144  alter table data
145      add Status (case WHEN missing(DeactReason) THEN 'Active' ELSE 'Inactive)'
                    -
                    79
ERROR 79-322: Expecting a CHECK.

146     END;
           -
           79
ERROR 79-322: Expecting a ).

147  quit;

谢谢! 编辑: 更正代码:

proc sql;
alter table table
    add Status (case WHEN missing(DeactReason) THEN 'Active' ELSE 'Inactive')
   END;
quit;

现在得到以下错误:

148  proc sql;
149  alter table table
150      add Status (case WHEN missing(DeactReason) THEN 'Active' ELSE 'Inactive')
                    -                                                            -
                    79                                                           22
                                                                                 76
ERROR 79-322: Expecting a CHECK.

ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +, -, /, <, <=,
              <>, =, >, >=, ?, AND, BETWEEN, CONTAINS, END, EQ, EQT, GE, GET, GT, GTT, IN, IS,
              LE, LET, LIKE, LT, LTT, NE, NET, NOT, NOTIN, OR, ^, ^=, |, ||, ~, ~=.

ERROR 76-322: Syntax error, statement will be ignored.

151     END;
152  quit;

ALTER TABLE语句用于添加新列、删除现有列或修改列的格式。 Afaik 你不能在 alter table 语句中使用 CASE 表达式。不过,您可以在 UPDATE 语句中完成。

proc sql;
    alter table data add status char label= "Status" format=.;
    update data set status=case when missing(DeactReason) then 'Active' else 'Inactive' end;
quit;

您不能使用 SQL ALTER 语句插入数据。

但修改现有数据集不是正常的分析步骤。 Plus 是危险的,因为如果出现问题,您可能会破坏原始数据集。

只需创建一个包含所需附加信息的新数据集即可。

With SQL 使用 PROC SQL.

proc sql;
  create table new as 
  select *
       , case WHEN missing(DeactReason) THEN 'Active' 
              ELSE 'Inactive' 
         END as STATUS
  from old
  ;
quit;

或使用普通 SAS 代码。

data new; 
   set old;
   if missing(DeactReason) THEN STATUS='Active  ';
                           ELSE STATUS='Inactive';

run;