如果条件和宏程序中有proc sql

问题描述 投票:0回答:1

我有一个要验证的控件。我想编写一个包含SQL proc的宏变量,以防条件被验证。范例:

%Macro Control1(List) / minoperator mindelimiter=' ';

%IF &Control1 in &List. %Then %do;

proc sql;

create table work.&Control1 as

Select id, count(id) as number

From data.&Produit.

group by id
having calculated number > 1
;
quit;

%end;

%mend;

%let list = &control1. &control2 &Control4 ;

%Control1(&List);

如果我们对control3执行相同的过程,则proc sql不会运行,因为control3不属于该列表。

我可能在语法上有一些错误?

if-statement sas data-analysis sas-macro proc-sql
1个回答
0
投票

您的主要问题是,您需要让SAS知道要在宏逻辑中使用in作为运算符。

要使用宏语言将IN用作运算符,则需要设置MINOPERATOR选项。为了确保它始终对您的宏有效,而与系统选项的设置方式无关,请将其添加到%macro语句中。

%macro Control1(List) / minoperator mindelimiter=' ';

但是您还有其他一些问题。

在为宏定义参数时,您只想输入要参数化的名称。您的示例在名称前有一个&,该名称将是无效的语法,并且用于引用宏变量的值,并且您不能使用该值对宏变量进行命名。因此,在定义宏时,只需列出名称

%macro control1(list) .....

注意,当您将参数值传递给宏时,如您在示例调用中所做的那样,请注意,当调用CALL宏可以引用宏变量时。

%if语句有多个问题。第一个似乎只是一个错字,在e宏变量名称的末尾添加了一个额外的list。第二个是逻辑错误。宏变量CONTROL1的值永远不会与其周围带有双引号字符的值相同。此外,不需要()运算符的值列表周围的in,但它们不会引起任何实际问题。

%if &control1 in &list %then %do;

您的SELECT语句缺少您选择的两个变量之间的逗号。

select id,count(id) as number

您的HAVING子句中的条件是无效的语法。您是否要测试计数是否大于1?另外,如果要引用已计算的变量,则需要使用CALCULATED关键字。

having calculated number > 1

最后,在您的宏中引用两个宏变量CONTROL1和PROUDUIT可能会造成混淆,这两个宏变量不是由代码定义的(甚至没有在注释中记录)。它们不是输入参数。您尚未将它们声明为局部宏变量。或做任何事情以确保它们将存在。

© www.soinside.com 2019 - 2024. All rights reserved.