Обновите SQL с условием JOIN на основе случая, когда - PullRequest
0 голосов
/ 20 января 2020

У меня есть набор данных (BASE) со следующей структурой: столбец с индексом для каждой записи, столбец с типом классификации, значением классификации и столбцом, который я хотел бы заполнить.

NAME |CLASSIFICATION|VALUE|STANDARD VALUE
FIDO |ALFABET       |F    |
ALFA |STANDARD      |2    |
BETA |STANDARD      |5    |
ETA  |MIXED         |B65  |
THETA|MIXED         |A40  |

Не все записи имеют одинаковую классификацию, однако у меня есть дополнительная таблица (TRANSCODE) для преобразования различных методов классификации в стандартный (классификация):

ALFABET|STANDARD|MIXED
A      |1       |A1
B      |5       |A30
C      |3       |A40
D      |5       |A31
E      |8       |B65
F      |6       |C54

Моя цель - заполнить четвертый столбец с соответствующим значением я могу найти со второй таблицей. (записи со стандартной классификацией будут иметь два столбца с одинаковой классификацией). После этого мои данные должны выглядеть примерно так:

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

Для этого я пытаюсь выполнить профессиональное c sql обновление с условием соединения, но, похоже, оно не работа

    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;

Может кто-нибудь мне помочь? Большое спасибо

1 Ответ

1 голос
/ 20 января 2020

Выбор значения для стандартного значения является поисковым запросом, поэтому вы не можете напрямую присоединиться к транскодированию.

Попробуйте этот запрос ОБНОВИТЬ, который использует разные выборки поиска для каждой классификации:

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;
...