Sas 根据以下情况使用联接条件更新SQL:

Sas 根据以下情况使用联接条件更新SQL:,sas,Sas,我有一个具有以下结构的数据集(基本):一个列,每个记录都有一个索引,一个列有一个分类类型、分类值和一个我想填充的列 NAME |CLASSIFICATION|VALUE|STANDARD VALUE FIDO |ALFABET |F | ALFA |STANDARD |2 | BETA |STANDARD |5 | ETA |MIXED |B65 | THETA|MIXED |A40 | 并非所有记录都具有

我有一个具有以下结构的数据集(基本):一个列,每个记录都有一个索引,一个列有一个分类类型、分类值和一个我想填充的列

NAME |CLASSIFICATION|VALUE|STANDARD VALUE
FIDO |ALFABET       |F    |
ALFA |STANDARD      |2    |
BETA |STANDARD      |5    |
ETA  |MIXED         |B65  |
THETA|MIXED         |A40  |
并非所有记录都具有相同的分类,但是我有一个附加表(转码),用于将不同的分类方法转换为标准方法(即分类):

我的目标是用第二个表中的相应值填充第四列。(具有标准分类的记录将有两列具有相同分类)。 之后,我的数据应如下所示:

NAME |CLASSIFICATION|VALUE|STANDARD VALUE
FIDO |ALFABET       |F    |6
ALFA |STANDARD      |2    |2
BETA |STANDARD      |5    |5
ETA  |MIXED         |B65  |8
THETA|MIXED         |A40  |3
为了做到这一点,我尝试使用连接条件进行procsql更新,但它似乎不起作用

    proc sql;
    update BASE
    left join TRASCODE
    on BASE.VALUE= (
        case 
            when BASE.CLASSIFCATION = 'ALFABET' then TRANSCODE.ALFABET 
            when BASE.CLASSIFICATION= 'STANDARD' then TRANSCODE.STANDARD
            when BASE.CLASSIFICATION= 'MIXED then TRANSCODE.MIXED
        end
    )
    set BASE.STANDARD_VALUE = TRANSCODE.STANDARD
;
quit;
有人能帮我吗?
非常感谢

标准值的值选择是一个查找查询,因此您不能直接连接到转码

尝试对每个分类使用不同查找选择的更新查询:

ALFABET|STANDARD|MIXED
A      |1       |A1
B      |5       |A30
C      |3       |A40
D      |5       |A31
E      |8       |B65
F      |6       |C54
data base;
infile cards missover;
input 
NAME $ CLASSIFICATION $ VALUE $ STANDARD_VALUE $; datalines;
FIDO  ALFABET       F    
ALFA  STANDARD      2    
BETA  STANDARD      5    
ETA   MIXED         B65  
THETA MIXED         A40  
run;
data transcode;
input 
ALFABET $ STANDARD $ MIXED $; datalines;
A      1       A1
B      5       A30
C      3       A40
D      5       A31
E      8       B65
F      6       C54
run;

proc sql;
  update base
  set standard_value = 
    case
      when classification = 'ALFABET'  then (select standard from transcode where alfabet=value)
      when classification = 'MIXED'    then (select standard from transcode where mixed=value)
      when classification = 'STANDARD' then value
      else 'NOTRANSCODE'
    end;

%let syslast = base;

非常感谢您快速而详细的回答,它成功了!再次感谢