2017-07-12 81 views
-2

對於任務,我被要求在Proc Sql語句中創建一個do循環。我的程序沒有識別m1sales和m2sales。這裏是我必須創建的數據集和宏。第一個宏是設置允許人們將qtr設置爲一個數字。第二個宏設置月份一,二和三取決於月份。第一個proc sql正在做我想做的事。第二個不是當我添加do語句時。我被給了附加語句:「%do循環不是'在'create table命令中'%do循環被create table命令後面的一系列文本替換;該文本可能是'在'創建表語句'。任何人都可以告訴我如何創建這個循環正確嗎?SAS中的Proc Sql Do循環

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 
; 

options symbolgen; 
%Macro quarter(quarter); 
%Global qtr; 
%Let qtr = &quarter; 
%Mend quarter; 
%quarter (1); 

options mprint symbolgen; 
%Macro Month(day); 
%Global One; 
%Global Two; 
%Global Three; 
%if &qtr = %eval(1) %then %do; 
    %Let One = 1; 
    %Let Two = 2; 
    %Let Three = 3; 
    %end; 
%Else %if &qtr = %eval(2) %then %do; 
    %Let One = 4; 
    %Let Two = 5; 
    %Let Three = 6; 
    %end; 
%Else %if &qtr = %eval(3) %then %do; 
    %Let One = 7; 
    %Let Two = 8; 
    %Let Three = 9; 
    %end; 
%Else %if &qtr = %eval(4) %then %do; 
    %Let One = 10; 
    %Let Two = 11; 
    %Let Three = 12; 
    %end; 
%Mend Month; 
%Month(&qtr); 

正確的代碼:不與do循環工作

%Macro qtrearn(x); 
proc sql; 
create table qtr&x as 
select Month&One..name, month&One..sales as m&One.sales, month&Two..sales as m&Two.sales, 
    month&Three..sales as m&Three.sales, sum(month&One..sales, month&Two..sales, month&Three..sales) as qtr&x.sales 
    from month&One, month&Two, month&Three 
    where month&One..name=month&Two..name=month&Three..name; 
select sum(m&One.sales) as m&One.total, sum(m&Two.sales) as m&Two.total, sum(m&Three.sales) as m&Three.total, 
    sum(qtr&x.sales) as qtr&x.total 
    from qtr&x; 
%Mend qtrearn; 
%qtrearn(&qtr); 

代碼。我需要爲作業插入do循環。

options mprint symbolgen; 
%Macro qtrearn(x); 
proc sql; 
%do i = &One %to &Three; 
create table qtr&x as 
select Month&i..name, month&&i..sales as m&&i.sales, 
    sum(month&One..sales, month&Two..sales, Month&Three..sales) as qtr&x.sales 
    from month&One, month&Two, month&Three 
    where month&One..name=month&Two..name=month&Three..name; 
%end; 
select sum(m&One.sales) as m&One.total, sum(m&Two.sales) as m&Two.total, sum(m&Three.sales) as m&Three.total, 
    sum(qtr&x.sales) as qtr&x.total 
    from qtr&x; 

%Mend qtrearn; 
%qtrearn(&qtr); 

回答

0

我能解決它。如果有人想要它。答案如下:

%Macro qtrearn(x); 
proc sql; 
create table qtr&x as 
select Month&One..name, 
    %do i = &One %to &Three; 
    month&&i..sales as m&&i.sales, 
    %end; 
    sum(month&One..sales, month&Two..sales, month&Three..sales) as qtr&x.sales 
    from month&One, month&Two, month&Three 
    where month&One..name=month&Two..name=month&Three..name; 
create table totals_qtr&x as 
select %do i = &One %to &Three; 
    sum(m&&i.sales) as m&&i.total, 
    %end; 
    sum(qtr&x.sales) as qtr&x.total 
    from qtr&x; 
proc print data=work.qtr&x; 
run; 
proc print data=work.totals_qtr&x; 
run; 
%Mend qtrearn; 
%qtrearn(&qtr);