<?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: Joining two datasets - summing up costs, taking time intervals into account in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908021#M358389</link>
    <description>&lt;P&gt;Below how you can get such sum variables by accident date and transaction type.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data accidents;
  infile datalines truncover dsd;
  input ID ACCIDENT_DATE :yymmdd10.;
  format ACCIDENT_DATE date9.;
  datalines;
1,2020/11/05
2,2018/01/20
3,2022/07/10
;

data claims;
  infile datalines truncover dsd;
  input ID TRANSACTION_DATE :yymmdd10. MONEY_VALUE TRANSACTION_TYPE :$1.;
  format TRANSACTION_DATE date9.;
  datalines;
1,2020/11/08,100,A
1,2020/11/20,500,B
1,2020/12/08,250,A
1,2021/01/08,600,C
1,2021/11/02,400,A
2,2018/01/22,500,X
2,2018/04/01,100,X
2,2018/08/11,900,X
3,2022/07/14,1000,X
3,2022/08/23,300,X
3,2022/10/10,200,X
3,2022/11/02,800,X
3,2023/01/11,500,X
3,2022/02/22,200,X
;

%let sv_missing=%sysfunc(getoption(missing,keyword));
options missing=' ';
proc sql;
/*  create table inter as*/
  select
    a.id,
    a.ACCIDENT_DATE,
    c.TRANSACTION_TYPE,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=30 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_30_DAYS,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=60 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_60_DAYS,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=90 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_90_DAYS,
    sum(c.MONEY_VALUE) as COSTS_ACCRUED_TOTAL
  from accidents a inner join claims c
    on a.id=c.id
  group by a.id, a.ACCIDENT_DATE, c.TRANSACTION_TYPE
  order by a.id, a.ACCIDENT_DATE, c.TRANSACTION_TYPE
  ;
quit;
options &amp;amp;sv_missing;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_0-1702567274532.png" style="width: 669px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/91374i1528791DF4A4B0CE/image-dimensions/669x107?v=v2" width="669" height="107" role="button" title="Patrick_0-1702567274532.png" alt="Patrick_0-1702567274532.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;You could now transpose this table to get variables by transaction type but I wouldn't do it because you'd end up with a varying number of variables depending on the transaction types in your data - and changing table structures are really hard to work with on a coding level.&lt;/P&gt;
&lt;P&gt;You can always use Proc's like Tabulate or Report to present your data in the way you have in mind - but don't create variables for it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let sv_missing=%sysfunc(getoption(missing,keyword));
options missing=' ';
proc tabulate data=inter;
  class id ACCIDENT_DATE TRANSACTION_TYPE;
  var COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL;
  keylabel sum=' ';
  table id*ACCIDENT_DATE*TRANSACTION_TYPE, 
        (COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL)
        ;
  table id*ACCIDENT_DATE, 
        TRANSACTION_TYPE*(COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL)
        ;
run;
options &amp;amp;sv_missing;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_1-1702567347121.png" style="width: 847px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/91375iB3F305503BA5008D/image-dimensions/847x288?v=v2" width="847" height="288" role="button" title="Patrick_1-1702567347121.png" alt="Patrick_1-1702567347121.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 14 Dec 2023 15:22:37 GMT</pubDate>
    <dc:creator>Patrick</dc:creator>
    <dc:date>2023-12-14T15:22:37Z</dc:date>
    <item>
      <title>Joining two datasets - summing up costs, taking time intervals into account</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/907988#M358381</link>
      <description>&lt;P&gt;Dear SAS community,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I got stuck with the following question, and unfortunately I was not able to find any kind of solution up to now:&lt;BR /&gt;&lt;BR /&gt;I have two datasets. The first one contains a unique ID and a date variable of the day when an event happened (=an accident). E.g.;&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;ID&amp;nbsp; ACCIDENT_DATE&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/05&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/01/20&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/07/10&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;Dataset two contains multiple rows of the ID variable (many of them not in dataset one), a financial transaction date, and the amount of money spend for a medical service, e.g.:&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;ID&amp;nbsp; TRANSACTION_DATE&amp;nbsp; MONEY_VALUE &lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 500&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/12/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 250&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2021/01/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 600&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2021/11/02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 400&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/01/22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 500&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/04/01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/08/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 900&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/07/14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1000&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/08/23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 300&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/10/10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/11/02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 800&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2023/01/11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 500&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/02/22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;Now, the task would be to join dataset two on dataset one, by summing up the amount of money for different time intervals, meaning e.g. money spend up to 30 days after the accident date, 60 days after the accident, and so on... then saving the results into new variables.&lt;BR /&gt;&lt;BR /&gt;Therefore, the output should look like this:&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;ID&amp;nbsp; ACCIDENT_DATE&amp;nbsp; COSTS_UNTIL_30_DAYS&amp;nbsp; COSTS_UNTIL_90_DAYS&amp;nbsp; COSTS_UNTIL_180_MONTHS&amp;nbsp; COSTS_UNTIL_360_MONTHS&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/01/20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/07/10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;This is the "easy" example.&lt;BR /&gt;&lt;BR /&gt;It would be perfectly, if it would be also possible to take additionally different types of transactions into account, while summing up the costs, e.g.:&lt;BR /&gt;&lt;BR /&gt;Dataset two:&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;ID&amp;nbsp; TRANSACTION_DATE&amp;nbsp; MONEY_VALUE&amp;nbsp; TRANSACTION_TYPE&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 500&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/12/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 250&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2021/01/08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 600&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2021/11/02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 400&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; A&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;[...]&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;with the result&lt;BR /&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;ID&amp;nbsp; ACCIDENT_DATE&amp;nbsp; A_COSTS_UNTIL_30_DAYS&amp;nbsp; A_COSTS_UNTIL_90_DAYS [...] B_COSTS_UNTIL_30_DAYS&amp;nbsp; B_COSTS_UNTIL_90_DAYS&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;1&amp;nbsp;&amp;nbsp; 2020/11/05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...] ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;2&amp;nbsp;&amp;nbsp; 2018/01/20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...] ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;3&amp;nbsp;&amp;nbsp; 2022/07/10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [...] ???&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ???&lt;/FONT&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Can anyone help?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I would be very happy and grateful for any kind of hint or solution &lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Best regrads&lt;/P&gt;&lt;P&gt;Lars&lt;/P&gt;</description>
      <pubDate>Thu, 14 Dec 2023 10:36:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/907988#M358381</guid>
      <dc:creator>ldataminer</dc:creator>
      <dc:date>2023-12-14T10:36:16Z</dc:date>
    </item>
    <item>
      <title>Re: Joining two datasets - summing up costs, taking time intervals into account</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908018#M358388</link>
      <description>&lt;P&gt;By 30 days do you mean exactly 30 days or by the same day in the following calendar month? 60 days&amp;nbsp; and 2 months?&lt;/P&gt;
&lt;P&gt;What exactly is the range of "and so on"? You show a variable implying 360 months. So there are a large number of possible combinations involved and I wouldn't even try to guess them.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You will have to walk us through examples of exactly how you think that "transaction type" gets used. I can see a couple of possibilities of how to interpret that.&lt;/P&gt;
&lt;P&gt;Note that "wide" format you propose for the results is going to be very cumbersome for any actual use.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Please provide example data in the form of data step code pasted into a text box in future questions. Examples below.&lt;/P&gt;
&lt;P&gt;This shows one way to get 30, 60 and 90 day totals. Not the only way. Also how many Id and accidents are&amp;nbsp; you talking about? Large data sets may require some additional bits to deal with size of data issues for efficiency.&lt;/P&gt;
&lt;PRE&gt;data accident;
   input ID  ACCIDENT_DATE : yymmdd10.;
   format ACCIDENT_DATE yymmdd10.;
datalines;
1   2020/11/05
2   2018/01/20
3   2022/07/10
;

data helpful;
  set accident;
   do days=30, 60, 90 ;
      lasttransdate = intnx('day',accident_date,days);
      output;
   end;
   format lasttransdate yymmdd10.;
run;


data transaction;
   input ID  TRANSACTION_DATE :yymmdd10.  MONEY_VALUE;
   format transaction_date yymmdd10.;
datalines;
1   2020/11/08        100
1   2020/11/20        500
1   2020/12/08        250
1   2021/01/08        600
1   2021/11/02        400
2   2018/01/22        500
2   2018/04/01        100
2   2018/08/11        900
3   2022/07/14        1000
3   2022/08/23        300
3   2022/10/10        200
3   2022/11/02        800
3   2023/01/11        500
3   2022/02/22        200
;


proc sql ;
   create table need as
   select a.*,b.transaction_date, b.money_value
   from helpful as a
        left join
        transaction as b
        on a.id = b.id
   where b.transaction_date le a.lasttransdate
   order by a.id, a.accident_date, a.days
   ;
quit;

proc summary data=need nway;
   class id days;
   id accident_date;
   var money_value;
   output out=sums (drop=_: ) sum=;
run;&lt;/PRE&gt;
&lt;P&gt;Once you have data such as this it is easy to reshape as needed for reporting.&lt;/P&gt;</description>
      <pubDate>Thu, 14 Dec 2023 15:08:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908018#M358388</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2023-12-14T15:08:24Z</dc:date>
    </item>
    <item>
      <title>Re: Joining two datasets - summing up costs, taking time intervals into account</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908021#M358389</link>
      <description>&lt;P&gt;Below how you can get such sum variables by accident date and transaction type.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data accidents;
  infile datalines truncover dsd;
  input ID ACCIDENT_DATE :yymmdd10.;
  format ACCIDENT_DATE date9.;
  datalines;
1,2020/11/05
2,2018/01/20
3,2022/07/10
;

data claims;
  infile datalines truncover dsd;
  input ID TRANSACTION_DATE :yymmdd10. MONEY_VALUE TRANSACTION_TYPE :$1.;
  format TRANSACTION_DATE date9.;
  datalines;
1,2020/11/08,100,A
1,2020/11/20,500,B
1,2020/12/08,250,A
1,2021/01/08,600,C
1,2021/11/02,400,A
2,2018/01/22,500,X
2,2018/04/01,100,X
2,2018/08/11,900,X
3,2022/07/14,1000,X
3,2022/08/23,300,X
3,2022/10/10,200,X
3,2022/11/02,800,X
3,2023/01/11,500,X
3,2022/02/22,200,X
;

%let sv_missing=%sysfunc(getoption(missing,keyword));
options missing=' ';
proc sql;
/*  create table inter as*/
  select
    a.id,
    a.ACCIDENT_DATE,
    c.TRANSACTION_TYPE,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=30 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_30_DAYS,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=60 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_60_DAYS,
    sum(
      case
        when c.TRANSACTION_DATE-a.ACCIDENT_DATE &amp;lt;=90 then c.MONEY_VALUE
        else .
        end
        ) as COSTS_UNTIL_90_DAYS,
    sum(c.MONEY_VALUE) as COSTS_ACCRUED_TOTAL
  from accidents a inner join claims c
    on a.id=c.id
  group by a.id, a.ACCIDENT_DATE, c.TRANSACTION_TYPE
  order by a.id, a.ACCIDENT_DATE, c.TRANSACTION_TYPE
  ;
quit;
options &amp;amp;sv_missing;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_0-1702567274532.png" style="width: 669px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/91374i1528791DF4A4B0CE/image-dimensions/669x107?v=v2" width="669" height="107" role="button" title="Patrick_0-1702567274532.png" alt="Patrick_0-1702567274532.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;You could now transpose this table to get variables by transaction type but I wouldn't do it because you'd end up with a varying number of variables depending on the transaction types in your data - and changing table structures are really hard to work with on a coding level.&lt;/P&gt;
&lt;P&gt;You can always use Proc's like Tabulate or Report to present your data in the way you have in mind - but don't create variables for it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let sv_missing=%sysfunc(getoption(missing,keyword));
options missing=' ';
proc tabulate data=inter;
  class id ACCIDENT_DATE TRANSACTION_TYPE;
  var COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL;
  keylabel sum=' ';
  table id*ACCIDENT_DATE*TRANSACTION_TYPE, 
        (COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL)
        ;
  table id*ACCIDENT_DATE, 
        TRANSACTION_TYPE*(COSTS_UNTIL_30_DAYS COSTS_UNTIL_60_DAYS COSTS_UNTIL_60_DAYS COSTS_ACCRUED_TOTAL)
        ;
run;
options &amp;amp;sv_missing;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Patrick_1-1702567347121.png" style="width: 847px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/91375iB3F305503BA5008D/image-dimensions/847x288?v=v2" width="847" height="288" role="button" title="Patrick_1-1702567347121.png" alt="Patrick_1-1702567347121.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 14 Dec 2023 15:22:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908021#M358389</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2023-12-14T15:22:37Z</dc:date>
    </item>
    <item>
      <title>Re: Joining two datasets - summing up costs, taking time intervals into account</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908029#M358393</link>
      <description>&lt;P&gt;Hi Patrick,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;thank you very much! That is exactly what I was looking for&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt;&amp;nbsp;It is unbelievable how quickly you could find the solution. I had been trying out different things already for a couple of days... Thank you!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Best regards&lt;/P&gt;&lt;P&gt;Lars&lt;/P&gt;</description>
      <pubDate>Thu, 14 Dec 2023 15:53:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908029#M358393</guid>
      <dc:creator>ldataminer</dc:creator>
      <dc:date>2023-12-14T15:53:52Z</dc:date>
    </item>
    <item>
      <title>Re: Joining two datasets - summing up costs, taking time intervals into account</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908031#M358394</link>
      <description>&lt;P&gt;Hi ballardw,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;thank you for your code! &lt;span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:"&gt;😊&lt;/span&gt; It helped me a lot too. ‌‌Patrick posted an answer almost at the same time, which is the solution I think.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;Lars&lt;/P&gt;</description>
      <pubDate>Thu, 14 Dec 2023 15:58:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Joining-two-datasets-summing-up-costs-taking-time-intervals-into/m-p/908031#M358394</guid>
      <dc:creator>ldataminer</dc:creator>
      <dc:date>2023-12-14T15:58:36Z</dc:date>
    </item>
  </channel>
</rss>

