T: SAS / Proc SQL - выберите в: не в: - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время у меня есть файл данных содержания proc, который выглядит следующим образом:

DATA CONTENTS;
    INPUT NAME $;
    DATALINES;
        VARA
        VARB
        VARC
        VARD
        VARE
    ;
RUN;

и я хочу превратить эту последнюю переменную в макропеременную, например,

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                WHERE NAME NOT IN:(VARA VARB)
;
QUIT;

Новое дополнение, которое я пытаюсь добавить, это

Where name not in:(VarA varB)

есть ли способ сделать это, так как мои VARA и VARB являются пользовательскими вводами со страницы моего контроллера, я не могу указать, чтобы они были разделены запятыми, поскольку они будут переменными "group_by" позже в скрипте.

EDIT:

Представьте, что в моем контроллере есть макропеременная

%LET group_by_variable = VARA VARB;

Затем я делаю ту же самую процедуру, но подставляю макрос-переменную следующим образом:

PROC SQL;
SELECT NAME INTO: MACRO_VARIABLE
    SEPARATED BY " "
        FROM CONTENTS
            WHERE VARNUM > 1
            AND
            WHERE NAME NOT IN:(&group_by_variable.)
 ;
QUIT;

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

В обычных операторах SAS вы можете использовать модификатор двоеточия для выполнения операций с усеченными строками.

if  NAME NOT IN: ('VARA' 'VARB')

Но в PROC SQL (а также в операторах WHERE) вы не можете. Поэтому вместо этого используйте оператор EQT.

WHERE NAME NOT EQT 'VARA'

Вы не можете использовать имена переменных с оператором IN. Но похоже, что вы имеете в виду не ссылки на имена переменных, а реальные строки символов. Поэтому вам нужно добавить кавычки вокруг значений.

Нетрудно добавить кавычки вокруг списка, разделенного пробелами. Вы можете сделать это одним вызовом функции, если между значениями ровно один пробел.

"%sysfunc(tranwrd(VARA VARB,%str( )," "))"

Если ваш список имен находится в макропеременной, то используйте compbl(), чтобы убедиться, что есть только один пробел.

%let mylist=%sysfunc(compbl(&mylist));
0 голосов
/ 08 ноября 2018

Да, вы можете сделать это, у вас просто неверный синтаксис в вашем запросе. Я бы посоветовал поискать несколько руководств по SAS SQL.

Во-первых, у вас может быть только один оператор 'where' для каждого оператора 'select'. Избавьтесь от второго «где» и просто получите «и».

Во-вторых, опустите символ «:» после оператора «in».

Наконец, добавьте запятые между переменными, которые вы проверяете.

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (VARA, VARB)
;
QUIT;

Если вы не можете добавить запятые, просто добавьте запятую в SAS, заменив все вхождения пробела на запятую.

PROC SQL;
    SELECT NAME INTO: MACRO_VARIABLE
        SEPARATED BY " "
            FROM CONTENTS
                WHERE VARNUM > 1
                AND
                NAME NOT IN (
                    %sysfunc(tranwrd(%quote(VARA VARB),%str( ),%str(, )))
                )
;
QUIT;
...