2017-07-12 2 views
-2

Pour une affectation, il est demandé de créer une boucle do dans l'instruction Proc Sql. Mon programme ne reconnaît pas les m1sales et m2sales. Voici les ensembles de données et les macros que j'ai dû créer. La première macro consiste à autoriser les utilisateurs à définir le qtr sur un nombre. La deuxième macro définit les mois un, deux et trois en fonction des mois. Le premier proc sql fait ce que je veux. La seconde n'est pas quand j'ajoute dans la déclaration do. On m'a donné l'instruction supplémentaire: "La boucle% do n'est pas 'dans' une commande create table La boucle% do est remplacée par une séquence de texte qui suit la commande create table, ce texte peut être de 'within' 'l'instruction create table. " Quelqu'un peut-il me dire comment créer cette boucle correctement?Proc Sql Do Loop dans SAS

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

code correct:

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

qui ne fonctionne pas avec la boucle faire. J'ai besoin d'insérer la boucle do pour une affectation.

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

Répondre

0

J'ai été capable de le résoudre. Au cas où quelqu'un d'autre le voudrait. Voici la réponse:

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