为季度编号定义宏变量

时间:2017-07-13 06:50:17

标签: macros sas

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);

任何人都可以帮我找出正确的解决方案吗?

2 个答案:

答案 0 :(得分:0)

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似乎很好。

答案 1 :(得分:0)

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

%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);