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);
任何人都可以帮我找出正确的解决方案吗?
答案 0 :(得分:0)
define a macro variable
意味着只需使用%let
来定义宏变量。 macro variables
是您在SQL中使用%let
,call symputx
或select 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);