2012-02-01 2 views
2

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

Эта команда не работает (не заполнит его в & не будет держать набл с флагом = 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; 

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

таблицы перекодировки (3 вары):

LoadPort LoadCountry LoadArea 
ARZEW ALGERIA  NAF 

MASTER (многие вары):

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

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

+0

Можете привести пример с некоторыми данными? Кроме того, вы должны вернуться к своему другому вопросу и «принять» ответ, который сработал для вас, как это предлагается в одном из комментариев. Это дает людям стимул отвечать на ваш вопрос. – itzy

ответ

1

Вы также можете использовать функцию 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; 
+0

Хорошая альтернатива! Большое спасибо за оба ваших ответа. – Sassafras

2

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

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.

+0

Спасибо, что сработало, хотя для сохранения всего набора данных я его модифицировал: proc sql; выберите coalesce (a.loadport, b.loadport), * от мастера поиска левого соединения b на a.loadcountry = b.loadcountry и a.loadarea = b.loadarea; quit; – Sassafras

 Смежные вопросы

  • Нет связанных вопросов^_^