<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Macro Variables in Proc sql in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515753#M2991</link>
    <description>&lt;P&gt;1) Move the &lt;STRONG&gt;title&lt;/STRONG&gt; line before (out from) the &lt;STRONG&gt;proc sql&lt;/STRONG&gt; line.&lt;/P&gt;
&lt;P&gt;2) SELECT statement in proc sql requires vars to be separated by commas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; I have added a macro list2sql to add the commas required:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro list2sql(var=);
 %let m = %sysfunc(countw("&amp;amp;var"));
 %if %eval(&amp;amp;m) &amp;gt; 0 
 %then 
 %let sqlvar = %scan(&amp;amp;var,1);
 %if %eval(&amp;amp;m) &amp;gt; 1 %then
 %do i=2 %to &amp;amp;m; 
 %let sqlvar = &amp;amp;sqlvar,%scan(&amp;amp;var,&amp;amp;i);
 %end;
 %put sqlvar= &amp;amp;sqlvar;
%mend list2sq;
/*** test list2sql
%list2sql(var=);
%list2sql(var=v1);
%list2sql(var=v1 v2 v3 v4);
******/

%macro cust(dsn = , vars = , age_range= , state=); 
   %if &amp;amp;state = "NY" %then %do; 
       proc print data = &amp;amp;dsn; 
	   var &amp;amp;vars; 
	   where State = &amp;amp;state and Age_Range = &amp;amp;age_range; 
	   title "Detail Listing of Account in &amp;amp;state and current date &amp;amp;sysdate"; 
	   run; 
	   
	   title "Total Balance in &amp;amp;state and in age &amp;amp;age_range current date &amp;amp;sysdate"; 
	   proc sql; 
	   select %list2sql(&amp;amp;vars), 
	          sum(Balance) as Total_Balance 
			  from &amp;amp;dsn where State = &amp;amp;state and Age_Range = &amp;amp;age_range; 
	   quit; 
	%end; 
%mend cust; 
%cust(dsn = datasetname, vars =Acct_ID Age Balance State, 
      age_range= "18-40", state = "NY");&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sun, 25 Nov 2018 06:10:35 GMT</pubDate>
    <dc:creator>Shmuel</dc:creator>
    <dc:date>2018-11-25T06:10:35Z</dc:date>
    <item>
      <title>Macro Variables in Proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515752#M2990</link>
      <description>&lt;P&gt;I have this macro cust. In proc sql I need to select only those variables that are listed in vars.&lt;/P&gt;&lt;P&gt;can anyone help for example I have a dataset with variables Acct_ID, Name, Age, Age_Range, Balance, State.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;so if I write&lt;/P&gt;&lt;P&gt;%cust(dsn = datasetname, vars = Acct_ID Age Balance State, age_range= "18-40, state = "NY");&lt;/P&gt;&lt;P&gt;Proc sql should also give same selected variable given in macro call.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%macro cust(dsn = , vars = , age_range= , state=);&lt;BR /&gt;&amp;nbsp; %if &amp;amp;state = "NY" %then&lt;BR /&gt;&amp;nbsp; %do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc print data = &amp;amp;dsn;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var &amp;amp;vars;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where State = &amp;amp;state and Age_Range = &amp;amp;age_range;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title "Detail Listing of Account in &amp;amp;state and current date &amp;amp;sysdate";&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title "Total Balance in &amp;amp;state and in age &amp;amp;age_range current date &amp;amp;sysdate";&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select &amp;amp;vars, sum(Balance) as Total_Balance&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* The line above can I write &amp;amp;vars like this because it is throwing error if I am writing like this. */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from &amp;amp;dsn&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where State = &amp;amp;state and Age_Range = &amp;amp;age_range;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;%end;&lt;/P&gt;&lt;P&gt;%mend cust;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;</description>
      <pubDate>Sat, 24 Nov 2018 23:56:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515752#M2990</guid>
      <dc:creator>ashc25901</dc:creator>
      <dc:date>2018-11-24T23:56:49Z</dc:date>
    </item>
    <item>
      <title>Re: Macro Variables in Proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515753#M2991</link>
      <description>&lt;P&gt;1) Move the &lt;STRONG&gt;title&lt;/STRONG&gt; line before (out from) the &lt;STRONG&gt;proc sql&lt;/STRONG&gt; line.&lt;/P&gt;
&lt;P&gt;2) SELECT statement in proc sql requires vars to be separated by commas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; I have added a macro list2sql to add the commas required:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro list2sql(var=);
 %let m = %sysfunc(countw("&amp;amp;var"));
 %if %eval(&amp;amp;m) &amp;gt; 0 
 %then 
 %let sqlvar = %scan(&amp;amp;var,1);
 %if %eval(&amp;amp;m) &amp;gt; 1 %then
 %do i=2 %to &amp;amp;m; 
 %let sqlvar = &amp;amp;sqlvar,%scan(&amp;amp;var,&amp;amp;i);
 %end;
 %put sqlvar= &amp;amp;sqlvar;
%mend list2sq;
/*** test list2sql
%list2sql(var=);
%list2sql(var=v1);
%list2sql(var=v1 v2 v3 v4);
******/

%macro cust(dsn = , vars = , age_range= , state=); 
   %if &amp;amp;state = "NY" %then %do; 
       proc print data = &amp;amp;dsn; 
	   var &amp;amp;vars; 
	   where State = &amp;amp;state and Age_Range = &amp;amp;age_range; 
	   title "Detail Listing of Account in &amp;amp;state and current date &amp;amp;sysdate"; 
	   run; 
	   
	   title "Total Balance in &amp;amp;state and in age &amp;amp;age_range current date &amp;amp;sysdate"; 
	   proc sql; 
	   select %list2sql(&amp;amp;vars), 
	          sum(Balance) as Total_Balance 
			  from &amp;amp;dsn where State = &amp;amp;state and Age_Range = &amp;amp;age_range; 
	   quit; 
	%end; 
%mend cust; 
%cust(dsn = datasetname, vars =Acct_ID Age Balance State, 
      age_range= "18-40", state = "NY");&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 25 Nov 2018 06:10:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515753#M2991</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2018-11-25T06:10:35Z</dc:date>
    </item>
    <item>
      <title>Re: Macro Variables in Proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515769#M2994</link>
      <description>alternatively use:&lt;BR /&gt;  proc sql;&lt;BR /&gt;     select %substr(&amp;amp;vars,2,%length(&amp;amp;vars)-2)&lt;BR /&gt;&lt;BR /&gt;where vars = "Acct_ID, Age, Balance, State" &lt;BR /&gt;      &lt;BR /&gt;</description>
      <pubDate>Sun, 25 Nov 2018 06:27:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515769#M2994</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2018-11-25T06:27:54Z</dc:date>
    </item>
    <item>
      <title>Re: Macro Variables in Proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515772#M2997</link>
      <description>&lt;P&gt;So if you are setting the macro variable VARS to a space delimited list of variable names.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%cust(dsn=datasetname,vars=Acct_ID Age Balance State,age_range="18-40",state="NY");&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then that will work well for the VAR statement of PROC PRINT.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;var Acct_ID Age Balance State;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But not work well for the columns list in a PROC SQL SELECT statement.&amp;nbsp; For SQL you want commas instead of spaces between the variable names. Like :&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;... select Acct_ID,Age,Balance,State ...&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;It is easy to convert using&amp;nbsp; %SYSFUNC() to call the TRANWRD() (or TRANSLATE()) function.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;select %sysfunc(tranwrd(&amp;amp;vars,%str( ),%str(,)))&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Just make sure that there is one and only one space between the variable names.&amp;nbsp; Which you can do with the COMPBL() function.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;select %sysfunc(tranwrd(%sysfunc(compbl(&amp;amp;vars)),%str( ),%str(,)))&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sun, 25 Nov 2018 06:59:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Macro-Variables-in-Proc-sql/m-p/515772#M2997</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2018-11-25T06:59:49Z</dc:date>
    </item>
  </channel>
</rss>

