Sql SAS从一行计算多个新变量

Sql SAS从一行计算多个新变量,sql,sas,multiple-columns,calculated-columns,Sql,Sas,Multiple Columns,Calculated Columns,我有一个数据集,如下所示: ID-----V1-----V2------V3 01------5------3-------7 02------3------8-------5 03------6------9-------1 我想根据特定列的行为计算3个新变量(ERR_CODE、ERR_DETAIL、ERR_ID) 如果V1大于4,则ERR_CODE=A和ERR_DETAIL=“超出范围”以及ERR_ID=[ID]\u A 如果V2大于4,则ERR_

我有一个数据集,如下所示:

    ID-----V1-----V2------V3    
    01------5------3-------7
    02------3------8-------5
    03------6------9-------1
我想根据特定列的行为计算3个新变量(ERR_CODE、ERR_DETAIL、ERR_ID)

  • 如果V1大于4,则ERR_CODE=A和ERR_DETAIL=“超出范围”以及ERR_ID=[ID]\u A
  • 如果V2大于4,则ERR_CODE=B和ERR_DETAIL=“Check Log”和ERR_ID=[ID]\B
  • 如果V3大于4,则ERR_CODE=C和ERR_DETAIL=“Fault”和ERR_ID=[ID]\u C
所需的输出表如下

    ID-----ERR_CODE----ERR_DETAIL---------ERR_ID
    01--------A--------Out of range---------01_A
    01--------C--------Fault----------------01_C
    02--------B--------Check Log------------02_B
    02--------C--------Fault----------------02_C
    03--------A--------Out of range---------03_A
    03--------B--------Check Log------------03_B
我正在使用SAS 9.3和EG 5.1。我尝试过循环、数组、if语句和case-when,但它自然会跳到下一行来计算何时满足条件。但我想计算每行的其他满足条件

我已经设法做到这一点,为每个条件创建单独的表,然后合并它们。但如果有很多条件可以合作的话,这似乎不是一个有效的方法

我的问题是,如何在不单独计算的情况下,一次计算每个ID的其他满足条件?输出表的行数将超过预期的输入,但对我来说,不可能通过应用case-when或if等实现


提前感谢,如果我不清楚,请道歉。

只需使用if/THEN/DO块即可。添加输出语句,为每个错误写入新的观察值

data have ;
  input ID $ V1-V3;
cards;
01 5 3 7
02 3 8 5
03 6 9 1
;

data want;
  set have;
  length ERR_CODE $1 ERR_DETAIL $20 ERR_ID $10 ;
  if v1>4 then do;
    err_code='A'; err_detail="Out of range"; err_id=catx('_',id,err_code);
    output;
  end;
  if v2>4 then do;
    err_code='B'; err_detail="Fault"; err_id=catx('_',id,err_code);
    output;
  end;
  if v3>4 then do;
    err_code='C'; err_detail="Check Log"; err_id=catx('_',id,err_code);
    output;
  end;
  drop v1-v3 ;
run;
结果:

Obs    ID    ERR_CODE    ERR_DETAIL      ERR_ID

 1     01       A        Out of range     01_A
 2     01       C        Check Log        01_C
 3     02       B        Fault            02_B
 4     02       C        Check Log        02_C
 5     03       A        Out of range     03_A
 6     03       B        Fault            03_B

使用
输入代码如果
或数组执行-这两种方法中的任何一种都可能是正确的方法,您只需稍微调整一下即可。一旦你这么做了,我们可以帮你。(
case when
不适用于多个测试,因此我不会这样做。)无论您喜欢哪种方法。当您想从输入行创建多个输出行时,您需要编写显式的
output
语句。