<?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 Looping through table names within a macro in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949547#M371420</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It's been a while since I've written macros so I'll need a refresher course on my task. I am using a prewritten macro and need help implementing a loop (or an easier solution) to run the macro for 100+ tables. I have stored the table names I want to use within a SQL table that I call directly into SAS with the variables "INPUT_TABLE" for CLAIMS and the variable "FINAL_TABLE" for FINAL_TABLE (which outputs the analyses being done in the macro).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So how can I run through each table without having to change the table names each run?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Code:&lt;/P&gt;&lt;PRE&gt;/* Example Table Dataset */
data SAS_FOLDER.ANALYSIS_TABLES;
  input INPUT_TABLE FINAL_TABLE;
  datalines;
  SQL_DATABASE.OVER65_2019 SAS_FOLDER.OVER65_2019_final
  SQL_DATABASE.OVER65_2020 SAS_FOLDER.OVER65_2020_final
  SQL_DATABASE.OVER65_2021 SAS_FOLDER.OVER65_2021_final
  SQL_DATABASE.OVER65_2022 SAS_FOLDER.OVER65_2022_final
  SQL_DATABASE.LOW_HTN_2019 SAS_FOLDER.LOW_HTN_2019_final
  SQL_DATABASE.LOW_HTN_2020 SAS_FOLDER.LOW_HTN_2020_final
;
run;

/* MACRO starts */
%MACRO COC;

%LET PATIENTID= patid;                      * !!! &amp;lt;---- SET NAME OF PATIENT IDENTIFIER;
%LET CLAIMS= DATABASE.TABLE; 
%LET FINAL_TABLE = SAS_FOLDER.TABLE_FINAL;
%LET PROV_NUM=providerid;                  * !!! &amp;lt;---- SET NAME UNIQUE PROVIDER ID NUMBER;
%LET SDATE= admit_date;                       * !!! &amp;lt;---- SET NAME OF DATE OF SERVICE ON THE PROFESSIONAL CLAIM;

/*
/******************************************************/
/**CODES TO BE USED**/
/******************************************************/
/*


/**DEFINE COHORT OF PATIENTS**/

proc sql;
create table PROFESSIONAL as
select *
from &amp;amp;CLAIMS;
quit;

data PROFESSIONAL; set PROFESSIONAL;

/**KEEP ONLY VALID PROVIDERS**/
IF &amp;amp;PROV_NUM NE ' ';

/**CREATE THIS VARIABLE TO COUNT UP NUMBER OF CLAIMS**/
NCLAIMS= 1;

KEEP &amp;amp;PATIENTID &amp;amp;SDATE &amp;amp;PROV_NUM NCLAIMS;
		
		
/**KEEP ONE CLAIM PER DAY PER PHYSICIAN*/
PROC SORT DATA= PROFESSIONAL NODUPKEY OUT= NODUP; BY &amp;amp;PATIENTID &amp;amp;SDATE &amp;amp;PROV_NUM; run;
PROC PRINT DATA= NODUP (OBS=10); run;

/**CALCULATE THE NUMBER OF VISITS PER PROVIDER**/
PROC SUMMARY DATA= NODUP NWAY;
		CLASS &amp;amp;PATIENTID &amp;amp;PROV_NUM;
		VAR NCLAIMS;
		OUTPUT OUT= PATIENT_PROV_DYAD (DROP= _:) SUM= ;
RUN;
PROC PRINT DATA= PATIENT_PROV_DYAD (OBS=10); run;

/**CALCULATE THE TOTAL NUMBER OF VISITS PER PATIENT**/
PROC SUMMARY DATA= NODUP NWAY;
		CLASS &amp;amp;PATIENTID;
		VAR NCLAIMS;
		OUTPUT OUT= PATIENT (DROP= _:) SUM(NCLAIMS)= TOTAL_VISITS;
RUN;
PROC PRINT DATA= PATIENT (OBS=10); run;

proc univariate data = PATIENT;
var TOTAL_VISITS;
run;

/**MERGE NUMBER OF VISITS BY PROVIDER TO THE TOTAL NUMBER OF VISITS*/
PROC SORT DATA= PATIENT_PROV_DYAD; BY &amp;amp;PATIENTID; run;
PROC SORT DATA= PATIENT; BY &amp;amp;PATIENTID; run;

DATA UPC;
		MERGE PATIENT_PROV_DYAD PATIENT;
		BY &amp;amp;PATIENTID;
		UPC= NCLAIMS/TOTAL_VISITS;
RUN;

PROC SORT DATA= UPC; BY &amp;amp;PATIENTID; run;

/**BICE-BOXERMAN- COC INDEX**/
DATA BB_COC (KEEP= &amp;amp;PATIENTID X TOTAL_VISITS);
		SET UPC;
		RETAIN X;
		BY &amp;amp;PATIENTID;
		IF FIRST.&amp;amp;PATIENTID THEN X= .;
		X+ (NCLAIMS*NCLAIMS);
		IF LAST.&amp;amp;PATIENTID THEN OUTPUT;
RUN;

DATA &amp;amp;FINAL_TABLE;
		SET BB_COC;
		BB_COC= (X-TOTAL_VISITS)/(TOTAL_VISITS*(TOTAL_VISITS-1));
		
		if TOTAL_VISITS ge 2;
RUN;

PROC MEANS DATA= &amp;amp;FINAL_TABLE;
		VAR BB_COC;
RUN;

proc univariate data = &amp;amp;FINAL_TABLE;
		var BB_COC;
run;

%MEND COC;

%COC;&lt;/PRE&gt;</description>
    <pubDate>Wed, 30 Oct 2024 23:06:36 GMT</pubDate>
    <dc:creator>GRC_coder</dc:creator>
    <dc:date>2024-10-30T23:06:36Z</dc:date>
    <item>
      <title>Looping through table names within a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949547#M371420</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It's been a while since I've written macros so I'll need a refresher course on my task. I am using a prewritten macro and need help implementing a loop (or an easier solution) to run the macro for 100+ tables. I have stored the table names I want to use within a SQL table that I call directly into SAS with the variables "INPUT_TABLE" for CLAIMS and the variable "FINAL_TABLE" for FINAL_TABLE (which outputs the analyses being done in the macro).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So how can I run through each table without having to change the table names each run?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Code:&lt;/P&gt;&lt;PRE&gt;/* Example Table Dataset */
data SAS_FOLDER.ANALYSIS_TABLES;
  input INPUT_TABLE FINAL_TABLE;
  datalines;
  SQL_DATABASE.OVER65_2019 SAS_FOLDER.OVER65_2019_final
  SQL_DATABASE.OVER65_2020 SAS_FOLDER.OVER65_2020_final
  SQL_DATABASE.OVER65_2021 SAS_FOLDER.OVER65_2021_final
  SQL_DATABASE.OVER65_2022 SAS_FOLDER.OVER65_2022_final
  SQL_DATABASE.LOW_HTN_2019 SAS_FOLDER.LOW_HTN_2019_final
  SQL_DATABASE.LOW_HTN_2020 SAS_FOLDER.LOW_HTN_2020_final
;
run;

/* MACRO starts */
%MACRO COC;

%LET PATIENTID= patid;                      * !!! &amp;lt;---- SET NAME OF PATIENT IDENTIFIER;
%LET CLAIMS= DATABASE.TABLE; 
%LET FINAL_TABLE = SAS_FOLDER.TABLE_FINAL;
%LET PROV_NUM=providerid;                  * !!! &amp;lt;---- SET NAME UNIQUE PROVIDER ID NUMBER;
%LET SDATE= admit_date;                       * !!! &amp;lt;---- SET NAME OF DATE OF SERVICE ON THE PROFESSIONAL CLAIM;

/*
/******************************************************/
/**CODES TO BE USED**/
/******************************************************/
/*


/**DEFINE COHORT OF PATIENTS**/

proc sql;
create table PROFESSIONAL as
select *
from &amp;amp;CLAIMS;
quit;

data PROFESSIONAL; set PROFESSIONAL;

/**KEEP ONLY VALID PROVIDERS**/
IF &amp;amp;PROV_NUM NE ' ';

/**CREATE THIS VARIABLE TO COUNT UP NUMBER OF CLAIMS**/
NCLAIMS= 1;

KEEP &amp;amp;PATIENTID &amp;amp;SDATE &amp;amp;PROV_NUM NCLAIMS;
		
		
/**KEEP ONE CLAIM PER DAY PER PHYSICIAN*/
PROC SORT DATA= PROFESSIONAL NODUPKEY OUT= NODUP; BY &amp;amp;PATIENTID &amp;amp;SDATE &amp;amp;PROV_NUM; run;
PROC PRINT DATA= NODUP (OBS=10); run;

/**CALCULATE THE NUMBER OF VISITS PER PROVIDER**/
PROC SUMMARY DATA= NODUP NWAY;
		CLASS &amp;amp;PATIENTID &amp;amp;PROV_NUM;
		VAR NCLAIMS;
		OUTPUT OUT= PATIENT_PROV_DYAD (DROP= _:) SUM= ;
RUN;
PROC PRINT DATA= PATIENT_PROV_DYAD (OBS=10); run;

/**CALCULATE THE TOTAL NUMBER OF VISITS PER PATIENT**/
PROC SUMMARY DATA= NODUP NWAY;
		CLASS &amp;amp;PATIENTID;
		VAR NCLAIMS;
		OUTPUT OUT= PATIENT (DROP= _:) SUM(NCLAIMS)= TOTAL_VISITS;
RUN;
PROC PRINT DATA= PATIENT (OBS=10); run;

proc univariate data = PATIENT;
var TOTAL_VISITS;
run;

/**MERGE NUMBER OF VISITS BY PROVIDER TO THE TOTAL NUMBER OF VISITS*/
PROC SORT DATA= PATIENT_PROV_DYAD; BY &amp;amp;PATIENTID; run;
PROC SORT DATA= PATIENT; BY &amp;amp;PATIENTID; run;

DATA UPC;
		MERGE PATIENT_PROV_DYAD PATIENT;
		BY &amp;amp;PATIENTID;
		UPC= NCLAIMS/TOTAL_VISITS;
RUN;

PROC SORT DATA= UPC; BY &amp;amp;PATIENTID; run;

/**BICE-BOXERMAN- COC INDEX**/
DATA BB_COC (KEEP= &amp;amp;PATIENTID X TOTAL_VISITS);
		SET UPC;
		RETAIN X;
		BY &amp;amp;PATIENTID;
		IF FIRST.&amp;amp;PATIENTID THEN X= .;
		X+ (NCLAIMS*NCLAIMS);
		IF LAST.&amp;amp;PATIENTID THEN OUTPUT;
RUN;

DATA &amp;amp;FINAL_TABLE;
		SET BB_COC;
		BB_COC= (X-TOTAL_VISITS)/(TOTAL_VISITS*(TOTAL_VISITS-1));
		
		if TOTAL_VISITS ge 2;
RUN;

PROC MEANS DATA= &amp;amp;FINAL_TABLE;
		VAR BB_COC;
RUN;

proc univariate data = &amp;amp;FINAL_TABLE;
		var BB_COC;
run;

%MEND COC;

%COC;&lt;/PRE&gt;</description>
      <pubDate>Wed, 30 Oct 2024 23:06:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949547#M371420</guid>
      <dc:creator>GRC_coder</dc:creator>
      <dc:date>2024-10-30T23:06:36Z</dc:date>
    </item>
    <item>
      <title>Re: Looping through table names within a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949551#M371421</link>
      <description>&lt;P&gt;Change the header of the macro to make the dataset names parameters:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%MACRO COC(claims,final_table);

%LET PATIENTID= patid;                      * !!! &amp;lt;---- SET NAME OF PATIENT IDENTIFIER;
%LET PROV_NUM=providerid;                  * !!! &amp;lt;---- SET NAME UNIQUE PROVIDER ID NUMBER;
%LET SDATE= admit_date;                       * !!! &amp;lt;---- SET NAME OF DATE OF SERVICE ON THE PROFESSIONAL CLAIM;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then you can call it from a DATA step:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_;
set sas_folder.analysis_tables;
call execute(cats('%nrstr(%coc(',input_table,',',final_table,'))'));
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 30 Oct 2024 23:27:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949551#M371421</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2024-10-30T23:27:39Z</dc:date>
    </item>
    <item>
      <title>Re: Looping through table names within a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949552#M371422</link>
      <description>&lt;P&gt;Below sample code to illustrate how to call a macro with data driven parameter passing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Example Table Dataset */
data work.ANALYSIS_TABLES;
  input INPUT_TABLE:$60. FINAL_TABLE:$60.;
  datalines;
  SQL_DATABASE.OVER65_2019 SAS_FOLDER.OVER65_2019_final
  SQL_DATABASE.OVER65_2020 SAS_FOLDER.OVER65_2020_final
  SQL_DATABASE.OVER65_2021 SAS_FOLDER.OVER65_2021_final
  SQL_DATABASE.OVER65_2022 SAS_FOLDER.OVER65_2022_final
  SQL_DATABASE.LOW_HTN_2019 SAS_FOLDER.LOW_HTN_2019_final
  SQL_DATABASE.LOW_HTN_2020 SAS_FOLDER.LOW_HTN_2020_final
;
run;

%MACRO COC(
  CLAIMS
  ,FINAL_TABLE
  );

  data demo;
    CLAIMS       = "&amp;amp;CLAIMS";
    FINAL_TABLE  = "&amp;amp;FINAL_TABLE";
  run;
  proc print data=demo;
  run;

%mend;

data _null_;
  set work.ANALYSIS_TABLES;
  cmd=cats( '%coc(',INPUT_TABLE,',',FINAL_TABLE,');' );
  call execute(cmd);
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You could of course also consider to first combine all your 100 source tables (only the variables you need) and then run the macro only once.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It's certainly also worth that you go through the actual SAS code within the macro and streamline it a bit - like the first Proc SQL looks totally unnecessary.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 30 Oct 2024 23:32:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949552#M371422</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2024-10-30T23:32:17Z</dc:date>
    </item>
    <item>
      <title>Re: Looping through table names within a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949553#M371423</link>
      <description>&lt;P&gt;This worked like magic! Thanks a bunch Kurt.&lt;/P&gt;</description>
      <pubDate>Wed, 30 Oct 2024 23:32:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Looping-through-table-names-within-a-macro/m-p/949553#M371423</guid>
      <dc:creator>GRC_coder</dc:creator>
      <dc:date>2024-10-30T23:32:01Z</dc:date>
    </item>
  </channel>
</rss>

