DATA Step, Macro, Functions and more

writing a data step to put in macro variable

Occasional Contributor nrb
Occasional Contributor
Posts: 11

writing a data step to put in macro variable

I have the following dataset: who's inputs are CustomerID, SaleDate,Variety, Quantity 

240W 02-07-2008 Ginger 120
240W 02-07-2008 Protea 180
356W 02-08-2008 Heliconia 60
356W 02-08-2008 Anthurium 300
188R 02-11-2008 Ginger 24
188R 02-11-2008 Anthurium 24
240W 02-12-2008 Heliconia 48
240W 02-12-2008 Protea 48
356W 02-12-2008 Ginger 240


 I have to Write a procedure to compute the average quantity of sale. I then have to Write a DATA step to put the average quantity in a macro variable AVG, I cant use the %let statement. Run the program below.

        proc chart data = flowersales;

        vbar variety / type=mean sumvar=quantity ref=&avg; run;


How would I do this? I can't figure it out, please help me understand how it would work. 

Super User
Posts: 17,819

Re: writing a data step to put in macro variable

The steps are outlined. 


First create the procedure to calculate the average - PROC MEANS

Secomd, create a macro variable in a data step - CALL SYMPUTX() 


Given the phrasing here, I suspect this is a homework assignment so I won't write the code for you.  

Posts: 40

Re: writing a data step to put in macro variable

First write the data step to get average into a variable. This can be done by Proc SQL AVG function or by Proc Means. Then you use the two ways to ask SAS to automatically add this into Macro:

By CallSymput routine
By Into: Statement in Proc SQL

Both the methods are explained here with examples:
Super User
Posts: 5,081

Re: writing a data step to put in macro variable

I would suggest a slightly different strategy.  Since you need a DATA step to create a macro variable, let the DATA step compute the average value as well.  Here is the idea:


data _null_;

set have (keep=quantity) end=nomore;

where quantity > .;

tot_quantity + quantity;

if nomore then do;

   * Divide TOT_QUANTITY by number of observations;

   * Transfer the result to a macro variable AVG;




The details are up to you.

Ask a Question
Discussion stats
  • 3 replies
  • 4 in conversation