SAS调用SYMPUT-一个宏变量,两个值?(有条件)

SAS调用SYMPUT-一个宏变量,两个值?(有条件),sas,sas-macro,Sas,Sas Macro,我想创建一个名为“currency_rate”的宏,它根据规定的条件调用正确的值 (新利率或1.5的静态值): 我对do循环和第一个数据步骤很满意。这是电话会议,但我一直在听。call symput是否是为一个宏指定两个可能值的正确函数 我将在proc sql中使用“货币汇率”的一个示例片段: t1.income/&currency_rate. 我是一个初级SAS用户,任何指导都会很好 谢谢宏变量只能保存一个值。 由于您只分配了一个值,因此可以轻松地使用CA

我想创建一个名为“currency_rate”的宏,它根据规定的条件调用正确的值 (新利率或1.5的静态值):

我对do循环和第一个数据步骤很满意。这是电话会议,但我一直在听。call symput是否是为一个宏指定两个可能值的正确函数

我将在proc sql中使用“货币汇率”的一个示例片段:

    t1.income/&currency_rate.          
我是一个初级SAS用户,任何指导都会很好


谢谢

宏变量只能保存一个值。 由于您只分配了一个值,因此可以轻松地使用CALL SYMPUTX()


但如果数据有多行,则该值将是数据集中的最后一个值集

让我们模拟一下你的情况。假设我们有3个数据集,如下所示-

data get_currency_1;
    input month code $ new_rate currency_rate;
cards;
1 USD 2 2
2 CHF 2 1.5
3 GBP 1 1.5
;
data get_currency_2;
    input month code $ new_rate currency_rate;
cards;
1 USD 3 1.5
2 USD 4 4
3 JPY 0.5 1.5
;
data get_currency_3;
    input month code $ new_rate currency_rate;
cards;
1 USD 1 1.5
2 USD 3 1.5
3 USD 2.5 2.5
;
现在,让我们运行您的代码,为
currency\u rate
指定一个值

让i=1这样,将访问数据集
get\u currency\u 1
。当我们运行该步骤时,将访问每一行,
currency\u rate
的值将分配给宏变量
currency\u rate
,该迭代将持续到数据步骤结束。此时,货币汇率的最后一个值将是宏观变量
货币汇率的最终值
,因为超过该值,步骤结束

%let i=1;   /*Let's assign 1 to i*/
data _null_;
    set get_currency_&i;
    if month = &i and  code = 'USD' then currency_rate=new_rate;
    else  currency_rate=1.5;
    call symput ('currency_rate', currency_rate);
run;
%put Currency rate is: &currency_rate;
    Currency rate is:          1.5
让i=3:

%let i=3;   /*Let's assign 3 to i*/
data _null_;
    set get_currency_&i;
    if month = &i and  code = 'USD' then currency_rate=new_rate;
    else  currency_rate=1.5;
    call symput ('currency_rate', currency_rate);
run;
%put Currency rate is: &currency_rate;
    Currency rate is:          2.5

一个宏变量不能有多个值。

您说自己是初学者,所以最好的做法是在这一点上避免宏编程。您最好通过语句学习
where
merge
(或
join
)和

您声明您需要在以下语句中使用
汇率

t1.income / &currency_rate.
t1.
对我来说意味着
t1
是SQL联接中的别名,因此更可能的情况是,您需要将包含收入的表
t1
与包含月度汇率的表1
(称之为月度数据)左联接

select
  t1.income / coaslesce(monthly_datum.currency_rates,1.5)
, …
from
  income_data as t1
left join
  monthly_datum
on t1.month = monthly_datum.month 

当收入与月度数据中不存在的月份相关时,将使用1.5的比率。

感谢您的澄清!如果不是宏观变量,是否有其他方法可以将这两个条件应用于一个“汇率”?两个不同的在我的查询中不起作用
t1.income / &currency_rate.
select
  t1.income / coaslesce(monthly_datum.currency_rates,1.5)
, …
from
  income_data as t1
left join
  monthly_datum
on t1.month = monthly_datum.month