BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
tianerhu
Pyrite | Level 9
libname results 'C:\practice everyday\output';
data results.output13_2;
total = 100;
do year = 1 to 3;
  do month = 1 to 12;
   total + total*0.05;
 output;
 end;
 total + 50;
end;
run;
proc print data = results.output13_2;
run;

tianerhu_0-1621304576456.png

libname results 'C:\practice everyday\output';
data results.output13_2;
total = 100;
do year = 1 to 3;
do month = 1 to 12;
total + total*0.05;
*output;
end;
total + 50;
end;
run;
proc print data = results.output13_2;
run;

 

tianerhu_1-1621304604122.png

 

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
mkeintz
PROC Star

In your first program you have an explicit OUTPUT statement inside the DO loop.  Therefore the normal implicit OUTPUT (just before the RUN; statement) is eliminated.  But in your second program, there is no explicit OUTPUT, so the implicit OUTPUT is executed.

 

So the question really is "why does the iterator YEAR in DO YEAR=1 to 3; ... END; end up as a 4"?   The iterator is always incremented (from 1 to 2, 2 to 3, 3 to 4) at the end of each iteration..  Once YEAR=4 there is no subsequent iteration of the DO loop executed, because it is now outside of the upper limit of 3.  Here's code to show that:

 

data _null_;
  do year=1 to 3 ;
    put 'inside ' year=;
  end;
  put 'after  ' year=;
run;

 

Now, if you really want to iterate from year=1 to 3 without year being incremented to 4 you can add an UNTIL expression:

data _null_;
  do year=1 to 3 until (year=3);
    put 'inside ' year=;
  end;
  put 'after  ' year=;
run;    

This works because the UNTIL expression (telling the loop when to stop) is evaluated at the end of each iteration, but before the iterator is incremented.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

View solution in original post

5 REPLIES 5
mkeintz
PROC Star

In your first program you have an explicit OUTPUT statement inside the DO loop.  Therefore the normal implicit OUTPUT (just before the RUN; statement) is eliminated.  But in your second program, there is no explicit OUTPUT, so the implicit OUTPUT is executed.

 

So the question really is "why does the iterator YEAR in DO YEAR=1 to 3; ... END; end up as a 4"?   The iterator is always incremented (from 1 to 2, 2 to 3, 3 to 4) at the end of each iteration..  Once YEAR=4 there is no subsequent iteration of the DO loop executed, because it is now outside of the upper limit of 3.  Here's code to show that:

 

data _null_;
  do year=1 to 3 ;
    put 'inside ' year=;
  end;
  put 'after  ' year=;
run;

 

Now, if you really want to iterate from year=1 to 3 without year being incremented to 4 you can add an UNTIL expression:

data _null_;
  do year=1 to 3 until (year=3);
    put 'inside ' year=;
  end;
  put 'after  ' year=;
run;    

This works because the UNTIL expression (telling the loop when to stop) is evaluated at the end of each iteration, but before the iterator is incremented.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
tianerhu
Pyrite | Level 9

Could you explain why the variable month become 13, the same way to the variable year ?

PaigeMiller
Diamond | Level 26

@tianerhu wrote:

Could you explain why the variable month become 13, the same way to the variable year ?


It's the same reason as year; the loop increments month to 13, then it stops as the loop will not run when month is 13.

--
Paige Miller

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 663 views
  • 1 like
  • 3 in conversation