<?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: Proc SQL loop through dates month at a time in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653897#M196416</link>
    <description>Thanks for the quick reply...not sure what happened to the formatting of my tables in the question.&lt;BR /&gt;&lt;BR /&gt;your solution would work, but would bring back all dates between a.start_date and a.end_data. 15JAN 16JAN 17JAN...&lt;BR /&gt;&lt;BR /&gt;I would only need to bring back data for the followings months on the same date as the start date. 15JAN 15FEB 15MAR..&lt;BR /&gt;&lt;BR /&gt;thanks&lt;BR /&gt;&lt;BR /&gt;</description>
    <pubDate>Sat, 06 Jun 2020 14:07:43 GMT</pubDate>
    <dc:creator>KamikazeBassi</dc:creator>
    <dc:date>2020-06-06T14:07:43Z</dc:date>
    <item>
      <title>Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653893#M196413</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am new to using macros and sas, so any help is much appreciated. &amp;nbsp;&lt;/P&gt;&lt;P&gt;I have two tables. &amp;nbsp;&lt;/P&gt;&lt;P&gt;one table lists accounts, start date and end date.&lt;/P&gt;&lt;P&gt;Accounts&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;ACCT&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;START_DATE&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;END_DATE&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15JAN2020&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15MAY2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27MAY2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Another table is a typical daily table for each account with a date and balance. &amp;nbsp;There is a row for each account, on each date.&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Data&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;ACCT&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;BAL&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;ID_DATE&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7.00&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15JAN2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;6.59&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;16JAN2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7.56&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;17JAN2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;43.54&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;45.66&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;28MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What i am trying to do is take the accounts data and for each account&amp;nbsp;loop through the data able from between the start and end date to bring back the balance.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I only want to bring back the balance on a monthly basis between the start and end date from when start date starts from. so I end up something like this for example.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;ACCT&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;BAL&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;ID_DATE&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;7.00&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15JAN2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15.00&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15FEB2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;32.33&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;43.24&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15APR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;1234&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;12.43&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;15MAY2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;43.54&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;43.52&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27MAR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;6789&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;23.42&lt;/P&gt;&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;27APR2020&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Im not sure if i am making it over complicated by using loops or can do it using sql and some built in SAS functions.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;any help very much appreciated.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Sat, 06 Jun 2020 13:41:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653893#M196413</guid>
      <dc:creator>KamikazeBassi</dc:creator>
      <dc:date>2020-06-06T13:41:12Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653896#M196415</link>
      <description>&lt;P&gt;No loop or something like that needed, only a SQL join:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
  select b.*
  from accounts a left join data b
  on a.acct = b.acct and b.id_date between a.start_date and a.end_date
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;(untested, posted from my tablet)&lt;/P&gt;</description>
      <pubDate>Sat, 06 Jun 2020 13:58:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653896#M196415</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-06-06T13:58:08Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653897#M196416</link>
      <description>Thanks for the quick reply...not sure what happened to the formatting of my tables in the question.&lt;BR /&gt;&lt;BR /&gt;your solution would work, but would bring back all dates between a.start_date and a.end_data. 15JAN 16JAN 17JAN...&lt;BR /&gt;&lt;BR /&gt;I would only need to bring back data for the followings months on the same date as the start date. 15JAN 15FEB 15MAR..&lt;BR /&gt;&lt;BR /&gt;thanks&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Sat, 06 Jun 2020 14:07:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653897#M196416</guid>
      <dc:creator>KamikazeBassi</dc:creator>
      <dc:date>2020-06-06T14:07:43Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653898#M196417</link>
      <description>&lt;P&gt;Add an additional condition to the ON clause:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;on a.acct = b.acct and b.id_date between a.start_date and a.end_date and day(b.id_date) = day(a.start_date)&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 06 Jun 2020 14:27:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653898#M196417</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-06-06T14:27:44Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653899#M196418</link>
      <description>&lt;P&gt;SQL does not have a looping process to create multiple rows from a single row.&amp;nbsp; DATA step does.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create a DATA step view that outputs rows for each mid-month point from START to END.&amp;nbsp; Then join the view with the DATA on view's dates&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Example:&lt;/P&gt;
&lt;PRE&gt;data accounts;
input acct start_date: date9. end_date: date9.;
format start_date end_date date9.;
datalines;
1234 15JAN2020 15MAY2020
6789 27MAR2020 27MAY2020
;

data dates_v / view=dates_v;
  set accounts;
  do index = 0 by 1 until (date &amp;gt;= end_date or index &amp;gt;= 1000);
    date = intnx('month', start_date, index, 'SAME');
    output;
  end;
  format date date9.;
  keep acct date;
run;
&lt;/PRE&gt;
&lt;P&gt;Then&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;create table want as 
select 
  data.*
from
  dates_v as V
left join 
  data
on 
  data.acct = V.acct and
  data.id_date = V.date&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 06 Jun 2020 14:34:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653899#M196418</guid>
      <dc:creator>RichardDeVen</dc:creator>
      <dc:date>2020-06-06T14:34:43Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653900#M196419</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;

data have1;
input ACCT	(START_DATE	END_DATE) (:date9.);
format START_DATE	END_DATE date9.;
cards;
1234	15-Jan-20	15-May-20
6789	27-Mar-20	27-May-20
;


data have2;
input ACCT	BAL	ID_DATE :date9.;
format id_date date9.; 
cards;
1234	7	15-Jan-20
1234	6.59	16-Jan-20
1234	7.56	17-Jan-20
6789	43.54	27-Mar-20
6789	45.66	28-Mar-20
;

data want ;
 if _n_=1 then do;
  dcl hash H () ;
  h.definekey  ("ID_DATE") ;
  h.definedata ("bal","ID_DATE") ;
  h.definedone () ;
 end;
 do until(last.acct);
  set have2;
  by acct;
  h.add();
 end;
 set have1;
 do until(START_DATE&amp;gt;END_DATE);
  if h.find(key:START_DATE) ne 0 then call missing(id_date,bal);
  output;
  START_DATE=intnx('mon',START_DATE,1,'s');
 end;
 h.clear();
 keep acct id_date bal START_DATE;
 rename START_DATE=date;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;This assumes the datasets are sorted just like your example&lt;/P&gt;</description>
      <pubDate>Sat, 06 Jun 2020 15:23:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/653900#M196419</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2020-06-06T15:23:51Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/654442#M196521</link>
      <description>&lt;P&gt;Something like this?&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
  create table want as select data.* 
   from data join accounts
   on data.ID_DATE between accounts.START_DATE and accounts.END_DATE
        and day(data.ID_DATE)=day(accounts.START_DATE);
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 08 Jun 2020 09:55:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/654442#M196521</guid>
      <dc:creator>s_lassen</dc:creator>
      <dc:date>2020-06-08T09:55:07Z</dc:date>
    </item>
    <item>
      <title>Re: Proc SQL loop through dates month at a time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/654455#M196524</link>
      <description>&lt;P&gt;Thanks for all the solutions, I am just trying them out to find which works most efficiently for my dataset.&amp;nbsp;&amp;nbsp; The dataset is quite large.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Ninder&lt;/P&gt;</description>
      <pubDate>Mon, 08 Jun 2020 11:00:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Proc-SQL-loop-through-dates-month-at-a-time/m-p/654455#M196524</guid>
      <dc:creator>KamikazeBassi</dc:creator>
      <dc:date>2020-06-08T11:00:18Z</dc:date>
    </item>
  </channel>
</rss>

