Найти значения в одной таблице и добавить в набор данных в соответствии с условием IF (MERGE / SQL)? - PullRequest
2 голосов
/ 01 февраля 2012

Мне нужно найти данные из одной таблицы и добавить их в таблицу основных данных на основе условия if: помечены ли данные как отсутствующие. Скажем, таблица соответствия содержит страны и порты. В главном файле отсутствуют имена портов, которые необходимо заполнить. Он заполняет их, используя поиск, только если flag = 1 (он отсутствует).

Эта команда не работает (не заполнит и не сохранит значения с флагом = 0):

proc sql; 
create table data.varswprice1 as 
select * 
from data.varswprice a left join data.LPortsFill b
on a.LoadCountry = b.LoadCountry and a.LoadArea = b.LoadArea
where LPortMiss = 1;
quit;

Вот пример с небольшим количеством данных ...

Таблица LOOKUP (3 варианта):

LoadPort LoadCountry  LoadArea
ARZEW    ALGERIA      NAF

MASTER (много переменных):

OBS    LoadPort  LoadCountry LoadArea  LPortMiss
1                 ALGERIA    NAF        1
2      ADELAIDE  AUSTRALIA   SEOZ       0

Таким образом, он должен заполнить первые obs в MASTER первыми obs в LOOKUP (ARZEW), основываясь на том факте, что LPortMiss = 1 и LoadCountry и LoadArea равны. В LOOKUP и MASTER есть еще много акций, но я надеюсь, что это лучше иллюстрирует проблему.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Я думаю, это то, что вы ищете:

proc sql;
    select coalesce(a.loadport,b.loadport), a.loadcountry, a.loadarea
    from master a left join lookup b
    on a.loadcountry=b.loadcountry and a.loadarea=b.loadarea;
quit;

Функция coalesce возвращает первый не пропущенный аргумент, поэтому, если loadport отсутствует в таблице master, тогда онаберет это из таблицы lookup.

Кстати, это не относится к SAS.Для таких вопросов вы можете использовать SQL метку.

1 голос
/ 01 февраля 2012

Вы также можете использовать функцию UPDATE в proc sql, это избавляет от необходимости создавать новый набор данных. Возможно, вы захотите сбросить флаг lportmiss.

proc sql;
update master as a
    set loadport=(select loadport from lookup as b
        where a.LoadCountry=b.LoadCountry and a.LoadArea=b.LoadArea)
where lportmiss=1;
quit;
...