2013-01-28 3 views
1
 
    data _null_; 
    set hash.bankholidays; 

     retain total 0; 
     format date :date9.; 

     set hash.oyster; 
      datetime = datepart(datetime); 
      format datetime :date9. ; 

      if date eq datetime then do; 
      total = total + amount; end; 


    put "total =" total; 

    run;  

Это дает мне диалоговое окно всплывающего окна в затмении: Multiple SET/MERGE statements in a data stepНесколько SET/MERGE заявление в шаге данных

Я интересно, что здесь происходит? Кажется, вы говорите, что не можете иметь инструкцию set в задании set, но я уверен, что я это сделал раньше.

например.

 
    data data_ex.giftwrap_ribbon_final; 
    set data_ex.giftwrap_w_ribbon_fl; 
     if not missing (first) and not missing (last) then do; 
      do i = first to last; 
      set data_ex.ribbon (keep=ribbon_colour) point = i; 
      output; 
      end; 
     end; 

     else do; 
     ribbon_colour = ''; 
     output; 
     end; 
    run; 

Могу ли я получить разъяснение здесь?

Кроме того, примерно последний надеты. Как я могу сказать, чтобы выполнить put после завершения инструкции set?

+0

Я никогда не слышал о DataServer, что это (просьба дать ссылку). Что касается вашего кода, что вам нужно сделать для этого шага данных: напечатайте «total» один раз? Если это так, опишите два набора данных «bankholidays» и «oyster», в том числе количество обс в каждом и которое содержит три переменные (дата, дата и время). – BellevueBob

+0

Я до сих пор не могу найти ни одной онлайн-ссылки на продукт под этим именем (не сказать, что его не существует, я просто не могу его найти). Во всяком случае, это звучит так: «Множественная ошибка SET/MERGE» особенно важна для Dataserver, потому что это совершенно хороший синтаксис SAS. Отвечает ли ответ CarolinaJay65 на ваши потребности во второй части вашего вопроса? – BellevueBob

ответ

1

Вам нужно обернуть набор статусов в цикл do и использовать указатели.

data _null_; 
set hash.bankholidays; 

    retain total 0; 
    format date :date9.; 

    do i = 1 to nobs; 
     set hash.oyster point = i nobs = nobs; 
      datetime = datepart(datetime); 
      format datetime :date9. ; 

      if date eq datetime then do; 
      total = total + amount; end; 
    end; 

put "total =" total; 

run;  
1

Вы можете узнать, когда последнее наблюдение выполняется на SET заявление с помощью END = вариант (в операторе SET) ... однако, вы не можете использовать эту опцию с POINT = Опция

data _null_; 
set hash.bankholidays end=first_last; 

retain total 0; 
format date :date9.; 

set hash.oyster end=second_last; 
    datetime = datepart(datetime); 
    format datetime :date9. ; 

    if date eq datetime then do; 
    total = total + amount; end; 


if second_last then put "total =" total; 

run; 

Вы можете абсолютно выполнить несколько инструкций SET в ШАГЕ ДАННЫХ ... вы пытались выполнить это в среде ID продукта SAS (EG или ПК SAS) вместо Eclipse?

+0

Так вы говорите, что код должен работать? Спасибо за подсказку об использовании последнего. :) – dwjohnston

+0

Я не тестировал его, потому что у меня нет данных, но, похоже, что-то не так с синтаксисом вашего кода (или моего). –

+0

Я нашел решение. Вам нужно обернуть инструкцию set в цикл do. Проверьте мой ответ. – dwjohnston

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