<?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 Use of MERGE in DATA step to generate all combinations of matched records from &amp;gt;2 datasets in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355314#M274035</link>
    <description>&lt;P&gt;I would like to know if MERGE can be used to generate a resulting dataset with all combinations of matching records in &amp;gt;2 datasets. For example, here are my three datasets:&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ORDERS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID ONUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 99&lt;/P&gt;
&lt;P&gt;1 88&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;data&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; MEDS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID MNUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 22&lt;/P&gt;
&lt;P&gt;1 33&lt;/P&gt;
&lt;P&gt;1 66&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;data&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; DRIPS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID DNUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 55&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I desire a dataset called ALL that contains these records:&lt;/P&gt;
&lt;P&gt;　&lt;BR /&gt;&lt;FONT size="1"&gt;ID&amp;nbsp;&amp;nbsp;&amp;nbsp;ONUM&amp;nbsp;&amp;nbsp;&amp;nbsp; MNUM&amp;nbsp;&amp;nbsp;&amp;nbsp; DNUM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;However when I use Merge, like this . . .&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;DATA&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ALL;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;MERGE&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ORDERS MEDS DRIPS; &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;BY&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;RUN&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size="3"&gt;... unfortunately I get &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="1"&gt;ID&amp;nbsp;&amp;nbsp;&amp;nbsp; ONUM&amp;nbsp;&amp;nbsp;&amp;nbsp; MNUM&amp;nbsp;&amp;nbsp;&amp;nbsp; DNUM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I understand that there is a way to achieve this in proc sql. But before I go that route I wanted to make sure that there is not a DATA step option that will give me the desired dataset.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Important aspects of this are that I will need this to work for &amp;gt;2 datasets at a time. I am using SAS Enterprise Guide 7.13 HF3 (7.100.3.5438)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you!&lt;/P&gt;</description>
    <pubDate>Tue, 02 May 2017 17:02:33 GMT</pubDate>
    <dc:creator>Rodcjones</dc:creator>
    <dc:date>2017-05-02T17:02:33Z</dc:date>
    <item>
      <title>Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355314#M274035</link>
      <description>&lt;P&gt;I would like to know if MERGE can be used to generate a resulting dataset with all combinations of matching records in &amp;gt;2 datasets. For example, here are my three datasets:&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;&lt;STRONG&gt;data&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ORDERS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID ONUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 99&lt;/P&gt;
&lt;P&gt;1 88&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;data&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; MEDS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID MNUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 22&lt;/P&gt;
&lt;P&gt;1 33&lt;/P&gt;
&lt;P&gt;1 66&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;　&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;data&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; DRIPS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;input&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID DNUM;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;cards&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1 55&lt;/P&gt;
&lt;P&gt;;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I desire a dataset called ALL that contains these records:&lt;/P&gt;
&lt;P&gt;　&lt;BR /&gt;&lt;FONT size="1"&gt;ID&amp;nbsp;&amp;nbsp;&amp;nbsp;ONUM&amp;nbsp;&amp;nbsp;&amp;nbsp; MNUM&amp;nbsp;&amp;nbsp;&amp;nbsp; DNUM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;However when I use Merge, like this . . .&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;DATA&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ALL;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;MERGE&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ORDERS MEDS DRIPS; &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Courier New" size="3"&gt;BY&lt;/FONT&gt;&lt;FONT face="Courier New" size="3"&gt; ID;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color="#000080" face="Courier New" size="3"&gt;RUN&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Courier New" size="3"&gt;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size="3"&gt;... unfortunately I get &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="1"&gt;ID&amp;nbsp;&amp;nbsp;&amp;nbsp; ONUM&amp;nbsp;&amp;nbsp;&amp;nbsp; MNUM&amp;nbsp;&amp;nbsp;&amp;nbsp; DNUM&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 33&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55 &lt;BR /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 88&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 66&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I understand that there is a way to achieve this in proc sql. But before I go that route I wanted to make sure that there is not a DATA step option that will give me the desired dataset.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Important aspects of this are that I will need this to work for &amp;gt;2 datasets at a time. I am using SAS Enterprise Guide 7.13 HF3 (7.100.3.5438)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you!&lt;/P&gt;</description>
      <pubDate>Tue, 02 May 2017 17:02:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355314#M274035</guid>
      <dc:creator>Rodcjones</dc:creator>
      <dc:date>2017-05-02T17:02:33Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355336#M274036</link>
      <description>&lt;P&gt;You cannot do it with MERGE.&lt;/P&gt;
&lt;P&gt;You can do it using SET and some complex programming. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;For example look at the POINT= option on the SET statement.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ORDERS;
input ID ONUM;
cards;
1 99
1 88
2 1
;
data MEDS;
input ID MNUM;
cards;
1 22
1 33
1 66
2 4
;
data DRIPS;
input ID DNUM;
cards;
1 55
2 5
;

data want ;
  do until (last.id);
    merge orders(keep=id in=in1) meds(keep=id in=in2) drips(keep=id in=in3);
    by id;
    n1+in1;
    n2+in2;
    n3+in3;
    if first.id and in1 then s1=n1;
    if first.id and in2 then s2=n2;
    if first.id and in3 then s3=n3;
    call missing(of in1-in3);
  end;
  if s1 then do i=s1 to n1;
    set orders point=i;
    if s2 then do j=s2 to n2;
      set meds point=j;
      if s3 then do k=s3 to n3;
        set drips point=k;
        output;
      end;
    end;
  end;
  drop s1-s3 n1-n3 ;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 02 May 2017 17:48:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355336#M274036</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2017-05-02T17:48:09Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355343#M274037</link>
      <description>&lt;P&gt;I agree with&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;, but can be done a bit simpler if you don't need to do it separately for multiple IDs:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data want;
  set orders;
  do i=1 to n1;
    set meds point=i nobs=n1;
    do j=1 to n2;
      set drips point=j nobs=n2;
      output;
    end;
  end;
run;
&lt;/PRE&gt;
&lt;P&gt;Art, CEO, AnalystFinder.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 May 2017 18:08:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355343#M274037</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2017-05-02T18:08:22Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355356#M274038</link>
      <description>&lt;P&gt;Hash technique isn't too bad either:)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;set orders;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if _N_ = &lt;STRONG&gt;1&lt;/STRONG&gt; then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if &lt;STRONG&gt;0&lt;/STRONG&gt; then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set meds;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set drips;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash myhash1(dataset:'meds',multidata:'YES' );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash1.defineKey('id');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash1.defineData('mnum');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash1.defineDone( );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash myhash2(dataset:'drips' );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash2.defineKey('id');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash2.defineData('dnum');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash2.defineDone( );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = myhash1.find();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc1= myhash2.find();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rc = &lt;STRONG&gt;0&lt;/STRONG&gt;) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=myhash1.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while(rc = &lt;STRONG&gt;0&lt;/STRONG&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=myhash1.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop rc:;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Naveen Srinivasan&lt;/P&gt;</description>
      <pubDate>Tue, 02 May 2017 18:44:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355356#M274038</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2017-05-02T18:44:13Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355358#M274039</link>
      <description>&lt;P&gt;There is always a way using keyed access, but as far as I can see, it isn't that simple&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ORDERS(index=(id));
input ID ONUM;
cards;
1 99
1 88
2 199
2 188
;
　
data MEDS(index=(id));
input ID MNUM;
cards;
1 22
1 33
1 66
2 122
2 133
2 166
;
　
data DRIPS(index=(id));
input ID DNUM;
cards;
1 55
2 155
;

data all;
set orders;
rmeds=1;
do until(medsDone);
    set meds key=id keyreset=rmeds;
    medsDone = _iorc_ ne 0;
    if not medsDone then do;
        rdrips=1; 
        do until (dripsDone);
            set drips key=id keyreset=rdrips;
            dripsDone = _iorc_ ne 0;
            if not dripsDone then output;
            end;
        end;
    end;
_error_ = 0;
drop medsDone dripsDone;
run;

proc print noobs; run;

/* Compare with */
proc sql;
create table simple as
select *
from 
    orders inner join 
    meds on orders.id = meds.id inner join
    drips on meds.id = drips.id;
select * from simple;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 02 May 2017 18:53:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355358#M274039</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2017-05-02T18:53:18Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355443#M274040</link>
      <description>&lt;P&gt;Here's the kind of complex programming needed if you use SET with point, &lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;and have multiple ID levels&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;.&amp;nbsp; It does not have an intuitive look to it:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want (drop=_:);
  retain _totalo _totalm _totald 0;

  _no=0; _nm=0; _nd=0;
  do until (last.id);
    set orders (in=ino)
        meds   (in=inm)
        drips  (in=ind);
    by id;
    _no+ino;
    _nm+inm;
    _nd+ind;
  end;


  do po=_totalo+min(1,_no) to _totalo+_no;
    if _no&amp;gt;0 then set orders point=po;
	do pm=_totalm+min(1,_nm) to _totalm+_nm;
      if _nm&amp;gt;0 then set meds point=pm;
	  do pd=_totald+min(1,_nd) to _totald+_nd;
	    if _nd&amp;gt;0 then set drips point=pd;
		output;
	  end;
	end;
  end;

  _totalo+_no;
  _totalm+_nm;
  _totald+_nd;
run;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 02 May 2017 23:52:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355443#M274040</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-05-02T23:52:37Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355573#M274041</link>
      <description>&lt;P&gt;Why not SQL's cartesian product ?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ORDERS;
input ID ONUM;
cards;
1 99
1 88
;
data MEDS;
input ID MNUM;
cards;
1 22
1 33
1 66
;
data DRIPS;
input ID DNUM;
cards;
1 55
;

proc sql;
create table want as
 select a.*,b.mnum,c.dnum
  from orders as a,meds as b,drips as c
   where a.id=b.id and a.id=c.id;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 03 May 2017 13:13:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355573#M274041</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2017-05-03T13:13:09Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355619#M274042</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/33790"&gt;@Rodcjones&lt;/a&gt;&lt;/P&gt;
&lt;P&gt;That's a great question in the sense that the answer really highlights the difference between a SAS datasetp merge and a SQL join. Once you understand these differences you can take full advantage of it and use the technique which suits your needs best on a case by case basis.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For what you're asking for: You're after&amp;nbsp;the result of a cartesian join as&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;mentions and this is something easily done with SQL but can involve&amp;nbsp;a lot of coding with data step SAS.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 May 2017 14:18:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355619#M274042</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2017-05-03T14:18:49Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355686#M274043</link>
      <description>&lt;P&gt;Thank you to Tom, art297, mkeintz, novinosrin, PGStats, Ksharp for your helpful replies. I am working through the solutions. And am also concluding that proc sql is the better approach. My limitation was that MERGE was giving me unexpected results and I didn't realize how MERGE works. I also thought it would be more efficient to use a data step than build the output through successive SQL joins (since I'm sometimes dealing with a large number of tables). Thanks for your expertise and effort.&lt;/P&gt;</description>
      <pubDate>Wed, 03 May 2017 17:16:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355686#M274043</guid>
      <dc:creator>Rodcjones</dc:creator>
      <dc:date>2017-05-03T17:16:22Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355802#M274044</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/33790"&gt;@Rodcjones&lt;/a&gt;&lt;/P&gt;
&lt;P&gt;"&lt;EM&gt;I also thought it would be more efficient to use a data step than build the output through successive SQL joins&lt;/EM&gt;"&lt;/P&gt;
&lt;P&gt;You can join multiple tables at once with SQL and don't need successive steps for this.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 May 2017 22:14:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355802#M274044</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2017-05-03T22:14:30Z</dc:date>
    </item>
    <item>
      <title>Re: Use of MERGE in DATA step to generate all combinations of matched records from &gt;2 datasets</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355806#M274045</link>
      <description>&lt;P&gt;Also note that the NATURAL JOIN can make SQL code easier to write. Works well for nice clear data structures like your simple example.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql ;
create table all as
  select * 
  from ORDERS
  natural join MEDS
  natural join DRIPS
  order by 1
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 03 May 2017 22:45:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Use-of-MERGE-in-DATA-step-to-generate-all-combinations-of/m-p/355806#M274045</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2017-05-03T22:45:35Z</dc:date>
    </item>
  </channel>
</rss>

