如何在SAS Proc SQL中编写条件where语句?

时间:2015-05-28 04:37:18

标签: sql sas sas-macro proc-sql

我有一个可用于多种情况的宏。

%macro Average(data=, tablename=, element=, variablename=, time =);
   PROC SQL;
      CREATE TABLE &tablename. AS 
      SELECT ID, AVG(&element.) AS &variablename.
      FROM &data.
      WHERE date_time < &time or date_time > &time + 1 /*first where condition*/
      GROUP BY ID;
   QUIT;
%mend;

/*second where condition*/  WHERE &Lower. < date_time < &Upper.
/*third where condition*/   WHERE &BP > 0 and &SP<100

我想将所有这三个语句放在一起放到sql宏中,而不是将宏复制三次。但我怎么能意识到呢?

2 个答案:

答案 0 :(得分:3)

如果您想要选择调用where条件的不同组合,您可以执行下面的操作,将默认值设置为1,除非您将它们分配给其他where条件:

%macro Average(data=, tablename=, element=, variablename=, time=
              ,whr1=1
              ,whr2=1
              ,whr3=1);

  PROC SQL;
  CREATE TABLE &tablename. AS 
    SELECT ID, AVG(&element.) AS &variablename.
    FROM &data.
    WHERE (&whr1) and (&whr2) and (&whr3)
    GROUP BY ID;
 QUIT;
%mend;

然后您可以使用where条件调用宏,例如:

%Average(whr1=%str(date_time < &time or date_time > &time + 1))

%Average(whr1=%str(date_time < &time or date_time > &time + 1)
        ,whr2=%str(&Lower. < date_time < &Upper.)
        ,whr3=%str(WHERE &BP > 0 and &SP<100))

答案 1 :(得分:0)

只需使用%if%,然后使用%else宏条件,此处定义了一个新参数:

%macro Average(data=, tablename=, element=, variablename=, time =, whr=);
    PROC SQL;
    CREATE TABLE &tablename. AS 
    SELECT ID, AVG(&element.) AS &variablename.
    FROM &data.
    %if &whr=1 %then %do;
    WHERE date_time < &time or date_time > &time + 1 /*first where condition*/
    %end;
    %else %if &whr=2 %then %do;
    WHERE &Lower. < date_time < &Upper.
    %end;
    %else %if &whr=3 %then %do;
    WHERE &BP > 0 and &SP<100
    %end;
    %else %put 'NO WHERE SPECIFIED';
    GROUP BY ID;
    QUIT;
    %mend;

如果您指定的参数声明whr = 1,则它将是默认值。 使用%if%然后%else你也可以使用宏内部的不同条件,我的意思是如果你想使用第一个where语句,如果某些条件为真,你可以指定它们。