2014-11-24 2 views
1

Я застреваю, пытаясь перебирать список значений в цикле macro% do. Каждое значение должно использоваться как суффикс переменной.Создание суффиксов при повторении через список

Подход основан на документации SAS: http://support.sas.com/kb/26/155.html

The (упрощенный) код:

%macro loop(values);       
    %let count=%sysfunc(countw(&values)); 
    %do i = 1 %to &count;   
     %let value=%qscan(values,i,%str(,)); 
     proc sql; 
      select count(distinct hut_id) as prefix_&value. 
      from saslib.tl1_results_eval 
      group by plan_cell; 
     quit; 
    %end;                    
%mend;     
%loop(%str(a,b,c,d)) 

сообщение в результате ошибки:

MLOGIC(LOOP): %DO loop beginning; index variable I; start value is 1; stop value is 4; by value 
     is 1. 
MLOGIC(LOOP): %LET (variable name is VALUE) 
MPRINT(LOOP): proc sql; 
22: LINE and COLUMN cannot be determined. 
NOTE 242-205: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and 
       COLUMN where the error has occurred. 
ERROR 22-322: Syntax error, expecting one of the following: ',', AS. 
MPRINT(LOOP): select count(distinct hut_id) as prefix_a from group by plan_cell; 
MPRINT(LOOP): quit; 

Интересно, что если я удалю «prefix_» из «count (отдельный hut_id) в качестве префикса_ & значение». - он работает абсолютно нормально. К сожалению, мне нужен префикс. Кроме того, как вы можете видеть в сообщении журнала, инструкция PROC SQL в конце концов компилируется правильно, но ошибки кода перед выполнением.

Любые идеи, что здесь происходит? Спасибо!

ответ

1

Вы вставляете невидимые символы цитирования из-за функции qscan. Попробуйте:

%macro loop(values);     
    proc sql;  
    %let count=%sysfunc(countw(&values)); 
    %do i = 1 %to &count;   
     %let value=%qscan(values,i,%str(,)); 
     select count(distinct hut_id) as prefix_%unquote(&value) 
     from saslib.tl1_results_eval 
     group by plan_cell; 
    %end; 
    quit;                
    %mend;     
    %loop(%str(a,b,c,d)) 

Обратите внимание на движение proc sql; заявления - есть несколько веских причин, чтобы бросить курить; и повторно установить процедуру SQL между каждым оператором SQL, что приводит к накладным расходам.

+0

Можете ли вы расширить эти «веские причины»? Спасибо –

+0

Чтобы получить статистику времени для каждого шага, а также, если вы хотите, чтобы последующие операторы SQL выполнялись после ошибки .. –

+0

Работал как шарм, RawFocus. Огромное спасибо! –

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