<?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: Merge (conditional?) with markers? in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151510#M39892</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;While you could probably achieve this with hashing, my inclination is to use formats instead.&amp;nbsp; This solution will fail if Table 2 contains duplicate values for either ID1 or ID2, but then you would expect that to be a problem case.&amp;nbsp; This code assumes that ID1 and ID2 are both character, although that issue can be circumvented if necessary.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First, create two formats from Table 2:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data table2_revised;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set table2 end=done;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length label $ 9;&lt;/P&gt;&lt;P&gt;&amp;nbsp; label=data2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id1fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; start=id1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; start=id2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if done;&lt;/P&gt;&lt;P&gt;&amp;nbsp; hlo='O';&lt;/P&gt;&lt;P&gt;&amp;nbsp; label='Not Found';&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id1fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id2fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=table2_revised;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by fmtname;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format cntlin=table2_revised;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This gives you 2 formats to work with, $id1fmt and $id2fmt, which translate ID1 and ID2 respectively into the matching value for DATA2.&amp;nbsp; There might be a little more complication if DATA 2 is numeric ... it might need to be converted to character along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;label = put(data2, best9.);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;At any rate, once you have the formats, the hard part is over.&amp;nbsp; You can use the formats along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set table1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; match_from_id1 = put(id1, $id1fmt.);&lt;/P&gt;&lt;P&gt;&amp;nbsp; match_from_id2 = put(id2, $id2fmt.);&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then you can play with the two new variables in any way you see fit.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good luck.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 09 May 2014 14:06:44 GMT</pubDate>
    <dc:creator>Astounding</dc:creator>
    <dc:date>2014-05-09T14:06:44Z</dc:date>
    <item>
      <title>Merge (conditional?) with markers?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151507#M39889</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I normally use proc sql for merging tables.&amp;nbsp; What I have is 2 tables that I want to merge together.&amp;nbsp; Both tables have 2 IDs (call them ID1 and ID2).&amp;nbsp; Because of time differences, etc. neither ID is 100% accurate at matching.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What I'd like is to do a left merge merging Table 2 onto Table 1 using ID1 and create a new variable equal to 1 if a match was found using ID1.&amp;nbsp; After that, I'd like to do a second left merge of Table 2 onto Table 1 using ID2, but only if a match wasn't found using ID1 (and create a second new variable equal to 1 if a match was found using ID2).&amp;nbsp; Although not necessary, it would also be nice if there were a way to not actually do a merge, but have a third new variable equal to 1 if a match was found using ID2 but wasn't performed because a match had already been found using ID1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here's an example:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Table 1:&lt;/P&gt;&lt;TABLE border="1" class="jiveBorder" style="border: 1px solid rgb(0, 0, 0); width: 100%;"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;ID1&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;ID2&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Data1&lt;/STRONG&gt;&lt;/TH&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;ab&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;80&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;2&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;b&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;55&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;5&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;x&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;10&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Table 2:&lt;/P&gt;&lt;TABLE border="1" class="jiveBorder" style="border: 1px solid rgb(0, 0, 0); width: 100%;"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;ID1&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;ID2&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Data2&lt;/STRONG&gt;&lt;/TH&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;a&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;12&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;ab&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;14&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;4&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;b&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;5&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;22&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;WANTED RESULT TABLE:&lt;/P&gt;&lt;TABLE border="1" class="jiveBorder" style="border: 1px solid rgb(0, 0, 0); width: 100%;"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;ID1&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;ID2&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Data1&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Data2&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;Merged on ID1&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Merged on ID2&lt;/STRONG&gt;&lt;/TH&gt;&lt;TH style="text-align: center; background-color: #6690bc; color: #ffffff; padding: 2px;" valign="middle"&gt;&lt;STRONG&gt;Match with ID2 but not merged&lt;/STRONG&gt;&lt;/TH&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;ab&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;80&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;14&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;2&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;100&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;.&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;b&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;55&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;15&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD style="padding: 2px;"&gt;5&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;x&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;10&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;22&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;1&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;TD style="padding: 2px;"&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 May 2014 05:17:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151507#M39889</guid>
      <dc:creator>yeaforme</dc:creator>
      <dc:date>2014-05-09T05:17:23Z</dc:date>
    </item>
    <item>
      <title>Re: Merge (conditional?) with markers?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151508#M39890</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;There are a lot of differences between a SQL and SAS datastep approach.&lt;/P&gt;&lt;P&gt;Using a SAS datastep Merge &lt;A href="http://support.sas.com/documentation/cdl/en/lestmtsref/63323/HTML/default/viewer.htm#n1i8w2bwu1fn5kn1gpxj18xttbb0.htm" title="http://support.sas.com/documentation/cdl/en/lestmtsref/63323/HTML/default/viewer.htm#n1i8w2bwu1fn5kn1gpxj18xttbb0.htm"&gt;SAS(R) 9.3 Statements: Reference&lt;/A&gt; and the IN= dataset option &lt;A href="http://support.sas.com/documentation/cdl/en/ledsoptsref/63326/HTML/default/viewer.htm#n1p1o2dsuc465nn198ovwdrj9mvy.htm" title="http://support.sas.com/documentation/cdl/en/ledsoptsref/63326/HTML/default/viewer.htm#n1p1o2dsuc465nn198ovwdrj9mvy.htm"&gt;SAS(R) 9.3 Data Set Options: Reference&lt;/A&gt; is given you quite a lot of requested logic.&lt;/P&gt;&lt;P&gt;What you are really wanting with matched/unmatched observations or possible using a table-lookup on the additional identifier is not clear.&lt;/P&gt;&lt;P&gt;As you are possible in a data-cleansing stage it could you are also not knowing all details. By that you need to investigate.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 May 2014 06:37:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151508#M39890</guid>
      <dc:creator>jakarman</dc:creator>
      <dc:date>2014-05-09T06:37:49Z</dc:date>
    </item>
    <item>
      <title>Re: Merge (conditional?) with markers?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151509#M39891</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This gets you your required result:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data table1;&lt;/P&gt;&lt;P&gt;input ID1 ID2:$ Data1;&lt;/P&gt;&lt;P&gt;cards;&lt;/P&gt;&lt;P&gt;1 ab 80&lt;/P&gt;&lt;P&gt;2 . 100&lt;/P&gt;&lt;P&gt;. b 55&lt;/P&gt;&lt;P&gt;5 x 10&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data table2;&lt;/P&gt;&lt;P&gt;input ID1 ID2:$ Data2;&lt;/P&gt;&lt;P&gt;cards;&lt;/P&gt;&lt;P&gt;. a 12&lt;/P&gt;&lt;P&gt;1 ab 14&lt;/P&gt;&lt;P&gt;4 b 15&lt;/P&gt;&lt;P&gt;5 . 22&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=table1;&lt;/P&gt;&lt;P&gt;by ID1;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=table2;&lt;/P&gt;&lt;P&gt;by ID1;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data&lt;/P&gt;&lt;P&gt;&amp;nbsp; merge1 (keep=ID1 ID2 data1 data2 var1 var3)&lt;/P&gt;&lt;P&gt;&amp;nbsp; rest1 (keep=ID1 ID2 data1)&lt;/P&gt;&lt;P&gt;&amp;nbsp; rest2 (keep=ID1 ID21 data2 rename=(ID21=ID2))&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;merge&lt;/P&gt;&lt;P&gt;&amp;nbsp; table1 (in=a)&lt;/P&gt;&lt;P&gt;&amp;nbsp; table2 (&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; in=b&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rename=(ID2=ID21)&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;by ID1;&lt;/P&gt;&lt;P&gt;if a and b and ID1 ne .&lt;/P&gt;&lt;P&gt;then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var1 = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ID2 = ID21&lt;/P&gt;&lt;P&gt;&amp;nbsp; then var3 = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else var3 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output merge1;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var1 = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if a&lt;/P&gt;&lt;P&gt;&amp;nbsp; then output rest1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if b&lt;/P&gt;&lt;P&gt;&amp;nbsp; then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID2 = ID21;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output rest2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=rest1;&lt;/P&gt;&lt;P&gt;by ID2;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=rest2;&lt;/P&gt;&lt;P&gt;by ID2;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data&lt;/P&gt;&lt;P&gt;&amp;nbsp; merge2 (drop=ID11)&lt;/P&gt;&lt;P&gt;&amp;nbsp; rest3 (drop=ID11)&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;merge&lt;/P&gt;&lt;P&gt;&amp;nbsp; rest1 (in=a)&lt;/P&gt;&lt;P&gt;&amp;nbsp; rest2 (in=b rename=(ID1=ID11))&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;by ID2;&lt;/P&gt;&lt;P&gt;if a and b&lt;/P&gt;&lt;P&gt;then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; var2 = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output merge2;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;else if ID1 ne .&lt;/P&gt;&lt;P&gt;then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if a then output rest3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID1 = ID11;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output rest3;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data result;&lt;/P&gt;&lt;P&gt;format ID1 ID2 data1 data2 var1 var2 var3; *puts the vars in order;&lt;/P&gt;&lt;P&gt;set merge1 merge2 rest3;&lt;/P&gt;&lt;P&gt;if var1 = . then var1 = 0;&lt;/P&gt;&lt;P&gt;if var2 = . then var2 = 0;&lt;/P&gt;&lt;P&gt;if var3 = . then var3 = 0;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;var1 = matched by ID1&lt;/P&gt;&lt;P&gt;var2 = matched by ID2;&lt;/P&gt;&lt;P&gt;var3 = ID2 would have matched, but ID1 took preference&lt;/P&gt;&lt;P&gt;var2 = &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 May 2014 08:55:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151509#M39891</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2014-05-09T08:55:42Z</dc:date>
    </item>
    <item>
      <title>Re: Merge (conditional?) with markers?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151510#M39892</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;While you could probably achieve this with hashing, my inclination is to use formats instead.&amp;nbsp; This solution will fail if Table 2 contains duplicate values for either ID1 or ID2, but then you would expect that to be a problem case.&amp;nbsp; This code assumes that ID1 and ID2 are both character, although that issue can be circumvented if necessary.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First, create two formats from Table 2:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data table2_revised;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set table2 end=done;&lt;/P&gt;&lt;P&gt;&amp;nbsp; length label $ 9;&lt;/P&gt;&lt;P&gt;&amp;nbsp; label=data2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id1fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; start=id1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; start=id2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if done;&lt;/P&gt;&lt;P&gt;&amp;nbsp; hlo='O';&lt;/P&gt;&lt;P&gt;&amp;nbsp; label='Not Found';&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id1fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; fmtname='$id2fmt';&lt;/P&gt;&lt;P&gt;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=table2_revised;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by fmtname;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format cntlin=table2_revised;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This gives you 2 formats to work with, $id1fmt and $id2fmt, which translate ID1 and ID2 respectively into the matching value for DATA2.&amp;nbsp; There might be a little more complication if DATA 2 is numeric ... it might need to be converted to character along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;label = put(data2, best9.);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;At any rate, once you have the formats, the hard part is over.&amp;nbsp; You can use the formats along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set table1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; match_from_id1 = put(id1, $id1fmt.);&lt;/P&gt;&lt;P&gt;&amp;nbsp; match_from_id2 = put(id2, $id2fmt.);&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then you can play with the two new variables in any way you see fit.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good luck.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 May 2014 14:06:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Merge-conditional-with-markers/m-p/151510#M39892</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2014-05-09T14:06:44Z</dc:date>
    </item>
  </channel>
</rss>

