Is there a way to create variables like - DEC_2020 etc..from:
%macro stupid;
proc sql;
create table B as
select *
%do i=1 %to 6;
,1 as 'DEC_'||%EVAL(2019+&i.)
%end;
from A;
quit;
%mend;
The expression 'DEC_'||%EVAL(2019+&I.) is not working as expected, but is there a function or any other way where I can get this to work?
I think you have to explain more clearly exactly what you want to do.
Does this answer your question ?
data have;
informat start_date anydtdte.;
input start_date var_2021 var_2022 var_2025;
value=vvaluex(cats('var_',year(start_date)));
put value=;
cards;
DEC2021 1 2 3
APR2022 4 5 6
JUN2025 7 8 9
;
run;
Are you required to use SQL?
A data step can be easier.
Otherwise, remove the quotes around Dec and the || and see if you get what you need.
@thepushkarsingh wrote:
Is there a way to create variables like - DEC_2020 etc..from:
%macro stupid;
proc sql;
create table B as
select *
%do i=1 %to 6;
,1 as 'DEC_'||%EVAL(2019+&i.)
%end;
from A;
quit;
%mend;
The expression 'DEC_'||%EVAL(2019+&I.) is not working as expected, but is there a function or any other way where I can get this to work?
"Are you required to use SQL?
A data step can be easier."
That's sound of a real professional who knows stuff
Apologies, I constructed a wrong example(SQL is definitely not needed).
What I intend to ask is 'is there a way(any function) to evaluate an expression, which takes value from another variable and use it as a reference to a variable?'.
Like let's say the variable start_date is populated as-
start_date
DEC2021
APR2022
JUN2025
...
And accordingly the reference changes from Variable VAR_2021 to VAR_2022 to VAR_2025 for different rows.
I think you have to explain more clearly exactly what you want to do.
Does this answer your question ?
data have;
informat start_date anydtdte.;
input start_date var_2021 var_2022 var_2025;
value=vvaluex(cats('var_',year(start_date)));
put value=;
cards;
DEC2021 1 2 3
APR2022 4 5 6
JUN2025 7 8 9
;
run;
Thank you very much.
@thepushkarsingh wrote:
Is there a way to create variables like - DEC_2020 etc..from:
%macro stupid;
proc sql;
create table B as
select *
%do i=1 %to 6;
,1 as 'DEC_'||%EVAL(2019+&i.)
%end;
from A;
quit;
%mend;
The expression 'DEC_'||%EVAL(2019+&I.) is not working as expected, but is there a function or any other way where I can get this to work?
One way:
%macro stupid; proc sql; create table B as select * %do i=1 %to 6; %let temp= %eval(2019+&i.); ,1 as DEC_&temp. %end; from a; quit; %mend;
macro language does concatenation a bit differently so you don't need the || operator. Also variable names in SQL can't be in quotes.
I create a temporary variable so it is a bit clearer what happens with the DEC_&temp. string.
,1 as DEC_%eval(2019+&i.)
also works but can be a bit ugly AND you do not want a space before the %eval, which makes the code a tad uglier
Hello,
You are building variable names not strings containing variable names.
Hence the quotes and the concatenation operator are superfluous.
%macro stupid;
proc sql;
create table B as
select *
%do i=1 %to 6;
%let vname=DEC_%eval(2019+&i.);
,1 as &vname.
%end;
from sashelp.class;
quit;
%mend;
It would be simpler with a data step (no macro necessary).
data C;
set sashelp.class;
attrib DEC_2020-DEC_2025 length=3.;
array DEC DEC_2020-DEC_2025;
do over DEC;
DEC=1;
end;
run;
Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!
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.
Ready to level-up your skills? Choose your own adventure.