Я пытаюсь написать макрос, который создаст новую таблицу в зависимости от определенных критериев. Пользователь может ввести одно число или диапазон чисел, чтобы отфильтровать исходные данные.
Например, если начальный набор данных показан ниже, конечный пользователь может выбрать фильтрацию столбца Z по одному числу (т. е. где Z=1) или по диапазону чисел (т. е. где Z находится в диапазоне от 1 до 5).
X Y Z
0 1 3
2 7 9
0 0 0
2 1 1
Если пользователь хочет ввести диапазон чисел для фильтрации, будут заполнены значения для &start_range и &end_range. Если пользователь хочет отфильтровать одно число, &end_range будет равен нулю.
Мне нужен код, который будет проверять, равен ли &end_range нулю. Если это так, оператор where должен создать новую таблицу для всех строк, где столбец Z=&start_range. Если &end_range НЕ равен нулю (у него есть заполненное значение), оператор where создаст новую таблицу для всех строк, где столбец Z находится между &start_range и &end_range.
Для одного значения (где &start_range=1 и &end_range='') результирующая таблица будет следующей:
X Y Z
2 1 1
Для диапазона значений (где &start_range=1 и &end_range=5) результирующая таблица будет выглядеть так:
X Y Z
0 1 3
2 1 1
Это код, который у меня есть до сих пор, не уверен на 100%, правильный ли синтаксис, поэтому открыт для любых предложений, спасибо !!:
%macro filter();
proc sql;
create table filtered_data AS
select raw_data.*
from raw_data
WHERE
%if &end_range NE '' %then %do;
Z between '&start_range' AND '&end_range';
%end;
%else %do;
Z = '&start_range';
%end;
quit;
%mend;
%filter();
%macro
и указаны при вызове макроса. (2) Вам не нужно повторять весь запрос; вы можете поместить условия%if %then %else
в операторwhere
, чтобы управлять только теми строками кода, которые могут измениться. Это не сильно влияет, но дает понять тому, кто читает код, какая именно часть кода является условной. - person DWal   schedule 04.05.2015