【问题标题】:Define a macro variable for the quarter number为季度数定义一个宏变量
【发布时间】:2017-07-13 06:50:16
【问题描述】:

A 部分:

为季度数定义一个宏变量。这个想法是,这是“用户”在为新季度运行程序时唯一应该更改的内容。

B 部分:

为季度中的每个月定义宏变量,并将它们设置为等于从季度编号生成的月份值。提示:%if/%then

给定代码:

data Month1;
input Name $ sales;
cards;
    Joyce 235
    Marsha 352
    Bill 491
    Vernon 210
    Sally 418
    ;
data Month2;
input Name $ sales;
cards;
Joyce 169
Marsha 281
Bill 315
Vernon 397
Sally 305
;
data Month3;
input Name $ sales;
cards;
Joyce 471
Marsha 314
Bill 394
Vernon 291
Sally 337
;
data Month4;
input Name $ sales;
cards;
Joyce 338
Marsha 259
Bill 310
Vernon 432
Sally 362
;
data Month5;
input Name $ sales;
cards;
Joyce 209
Marsha 355
Bill 302
Vernon 416
Sally 475
;
data Month6;
input Name $ sales;
cards;
Joyce 306
Marsha 472
Bill 351
Vernon 405
Sally 358
;
proc sql;
create table qtr1 as
select Month1.name, month1.sales as m1sales, month2.sales as m2sales,
  month3.sales as m3sales, sum(month1.sales, month2.sales, month3.sales) as qtr1sales
  from month1, month2, month3
  where month1.name=month2.name=month3.name;
select sum(m1sales) as m1total, sum(m2sales) as m2total, sum(m3sales) as m3total,
  sum(qtr1sales) as qtr1total
  from qtr1;

我的解决方案:

/* question a */
%MACRO qtrn(qtr);

proc print data=&qtr ;
run;

%MEND qtrn;

/* question b */
%Macro Firstqtr(qtr);
     %Let I = 1;
    %If &qtr = qtr1 %then %do %until (&I > 3);
        %Let var&I = Month&I;
        %let I = %eval(&I + 1);
        %end;
%Mend Firstqtr;
%Firstqtr(qtr);

谁能帮我找出正确的解决方案?

【问题讨论】:

  • 如何将日期变量添加到数据中? (date_var=mdy(&month,'01',2017); 然后您可以按 Quarter=qtf(date_var) 对季度分组。
  • 我不应该更改或修改数据
  • 使用后删除变量。没人会知道吗? :)
  • 你能给我一些提示吗,我无法理解,怎么做
  • 你想多了。答案应该是一行代码。本月使用数据 null 步骤中的 INTNX 函数来创建宏变量,而不是使用宏和 %sysfunc()

标签: macros sas


【解决方案1】:

因为这看起来像是一个家庭作业问题,所以这是你答案的主要部分。我将留下最后的选择供您添加。考虑到以下解决方案,应该非常简单:

%macro qtrSales(qtr);   
    %do i = 1 %to 3;
       %let month&i = month%sysevalf((&qtr-1) * 3 + &i);
       %put &&month&i;
    %end;

    proc sql;
         create table qtr&qtr as
                select &month1..name, 
                       &month1..sales as &month1.sales, 
                       &month2..sales as &month2.sales,
                       &month3..sales as &month3.sales, 
                       sum(&month1..sales, &month2..sales, &month3..sales) as qtr&qtr.sales
                from &month1, &month2, &month3
                     where &month1..name=&month2..name=&month3..name;

                select sum(&month1.sales) as &month1.total, 
                       sum(&month2.sales) as &month2.total, 
                       sum(&month3.sales) as &month3.total,
                       sum(qtr&qtr.sales) as qtr&qtr.total
                from qtr&qtr; 

               select sum(&month1.sales) as &month1.total, 
                      sum(&month2.sales) as &month2.total, 
                      sum(&month3.sales) as &month3.total,
                      sum(qtr&qtr.sales) as qtr&qtr.total
                      from qtr&qtr;
               quit;


%mend qtrSales;
%qtrSales(2);

【讨论】:

  • 我已经更新了答案,请勾选复选标记接受。如果您不明白发生了什么,请询问有关代码的具体问题。没那么复杂。
  • 感谢您的帮助
【解决方案2】:

define a macro variable 意味着简单地使用%let 来定义一个宏变量。 macro variables 是您在 SQL 中使用 %letcall symputxselect into 定义的内容,然后使用 & 进行引用。

%let qtrn = 3;

给你。问题指定用户将对此进行调整,对吗?所以它并不要求你做任何工作,只是给用户一个地方来做这个改变。

至于第二个,我不完全理解提示。这里似乎没有必要使用条件逻辑。这是我会做的一个例子。

%let month1 = %eval(3*(&qtrn.-1)+1);

这只是根据季度计算第一个月的月份数。第 3 季度是 7/8/9 月份,对吗? 3*(3-1)+1 = 7, 3*(3-1)+2 = 8, 3*(3-1)+2 = 9。(或者你可以用不同的方法,3*3-2 = 7, 3*3-1 = 8, 3*3 = 9)

当然,您可以在宏中使用循环来定义它们。但这样做似乎有些过分——这不像宿舍里有 4 个月或 2 个月,对吧?他们总是有 3,这是一个季度的定义特征,所以硬编码 month1/month2/month3 似乎很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多