Как проверить наличие нулей в SQL / SAS - PullRequest
0 голосов
/ 19 июня 2019

У меня есть 2 листа Excel.

 Excel_Sheet1:  
 subject | T/F?  
 001     |  T  
 002     |  F  

 Excel_Sheet2:  
 subject | SiteId  | ReferenceId
 001     |         |     55
 002     |   44    |     66

Ожидаемый результат:

subject | SiteId   | ReferenceId
001     |          |     55

Это то, что я сделал, но это не дает правильного вывода.В настоящее время я пытаюсь добиться этого с помощью SQL в SAS, но я готов услышать способы сделать это через SAS.

Я пытаюсь сначала проверить, является ли это True в Excel_sheet1, а затем проверить наличиенесколько столбцов в Excel_sheet2, если все эти столбцы нулевые.Если все эти конкретные столбцы являются нулевыми, то вернуть ReferenceId из Excel_sheet2

/*
 *  Import files Excel_sheet1 as s1, Excel_sheet2 as s2
 */



proc sql;

/*
 *  Create table and add 
 */
CREATE table output (
    subject int, 
    SiteId int,
    RecordId int

);


INSERT INTO output
SELECT distinct s1.subject, s1.SiteId, s1.RecordId 
FROM mylib.sheet1 as s1 FULL OUTER JOIN mylib.sheet2 as s2 
ON s1.subject = s2.subject
WHERE s2.SiteId is Null
;
quit;


/* export as excel */

%put &output;   

Спасибо

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Просто выровняйте правильные типы данных, так как subject - это символьный столбец (с предшествующими нулями), а не числовой.Кроме того, исправьте псевдонимы с помощью s2.SiteId, s2.RecordId в SELECT предложении.

proc sql;
    /*
     *  Create table and add 
    */
    CREATE TABLE output (
        subject varchar(3),   
        SiteId int,
        RecordId int
    );

    INSERT INTO output
    SELECT distinct s1.subject, s2.SiteId, s2.ReferenceId 
    FROM Excel_Sheet1 as s1 
    FULL OUTER JOIN Excel_Sheet2 as s2 
    ON s1.subject = s2.subject
    WHERE s2.SiteId is Null;
quit;

В качестве альтернативы используйте синтаксис CREATE TABLE ... AS и задайте типы столбцов, определенные в запросе:

proc sql;
    CREATE TABLE output as
    SELECT distinct s1.subject, s2.SiteId, s2.ReferenceId 
    FROM Excel_Sheet1 as s1 
    FULL OUTER JOIN Excel_Sheet2 as s2 
    ON s1.subject = s2.subject
    WHERE s2.SiteId is Null;
quit;

И альтернативыIS NULL:

WHERE s2.SiteId is missing;

WHERE s2.SiteId = .;

Данные

data Excel_Sheet1;
    infile datalines delimiter=',' DSD; 
    length subject $ 3;
    length T_F $ 1;
    input subject $ T_F $;
    datalines;
001,T
002,F
;

data Excel_Sheet2;
    infile datalines delimiter=',' DSD; 
    length subject $ 3;
    input subject $ SiteId ReferenceId;
    datalines;
001,,55
002,44,66
;

Вывод

proc print data = Output; run;

Obs    subject     Id       Id;
1       001        .        55;

Сейчас, если вы хотите вывод макропеременной (не таблицы), используйте предложение INTO :

proc sql;
    SELECT distinct s2.ReferenceId 
    INTO :output
    FROM Excel_Sheet1 as s1 
    FULL OUTER JOIN Excel_Sheet2 as s2 
    ON s1.subject = s2.subject
    WHERE s2.SiteId = .;   *is missing;
quit;

%put &output.;  
55
0 голосов
/ 19 июня 2019

Изменение ГДЕ s1.SiteId равно нулю, ГДЕ s2.SiteId равно нулю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...