Выполните цикл в SAS SQL для создания столбца - PullRequest
1 голос
/ 14 октября 2019

Я новичок в SAS и SQL. У меня есть задача создать аналогичный столбец, но с другим номером.

Например: | DATE | NAME | A1 | A2 | A3 | B |

Так я кодирую в SAS вот так

PROC SQL;
    CREATE TABLE TEST AS
    SELECT DATE, NAME,
           DO i = 1 to 3
             0 AS A&i.,
           END
           1 as B
    FROM SOURCE;
QUIT;

Когда я запускаюЯ получил эту ошибку

Syntax error, expecting one of the following: !, !!, &, (, *, **, +, ',', -, '.', /, <, <=, <>, =, >, >=, AND, EQ, 
               EQT, GE, GET, GT, GTT, LE, LET, LT, LTT, NE, NET, OR, ^=, |, ||, ~=.  

Я ценю любую помощь. Спасибо.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Я думаю, вы должны использовать код macro для генерации имен столбцов, которые зависят от счетчика цикла. Например, в вашем случае:

%macro create_table(); %macro d; %mend d;

PROC SQL;
    CREATE TABLE TEST AS
    SELECT DATE, NAME,
           %DO i = 1 %to 3;
             0 AS A&i.,
           %END;
           1 as B
    FROM SOURCE;
QUIT;

%mend create_table;

%create_table();

Вывод:

+-------+------+----+----+----+---+
| date  | name | A1 | A2 | A3 | B |
+-------+------+----+----+----+---+

Кроме того, есть еще один способ выполнить задачу. Используйте шаг данных вместо proc sql:

data test(drop=i);
   set source;
   array a{3};
   do i=1 to 3;
      a{i} = 0;
   end;
   b=1;
run;
0 голосов
/ 14 октября 2019

Оператор шага данных array может использоваться для создания переменных (столбцов в терминологии SQL) и их инициализации. Оператор retain инициализирует переменную (один раз) значением, которое поддерживается от выходной строки к строке. Это отличается от b=1;, который будет выполнять присваивание значения при обработке каждой строки.

data want;
  set source;
  array a(3) (3*0);  /* initialization syntax, 3*0 means 3 zero (0) values */
  retain b 1;
run;

Переменными, созданными оператором массива, являются массив name , начинающийся с порядкового номера, начинающегося сиз 1. Синтаксис списка имен можно использовать в array для создания переменных с другим базовым именем и диапазоном последовательности. Имя, например

  array a(3) x7-x9 (3*0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...