<?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 tables in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754638#M238022</link>
    <description>&lt;P&gt;If every event is represented at least once in dataset2, you don't even need dataset1:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
select  	
	a.ID, 
	b.event,
	c.value,
	c.value2
from	
	(select distinct ID from dataset2) as a cross join
	(select distinct event from dataset2) as b left join
	dataset2 as c on a.ID=c.ID and b.event=c.event;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Edit:&amp;nbsp; Or&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
select      
    a.ID, 
    b.event,
    c.value,
    c.value2
from    
    (select distinct ID from dataset2) as a cross join
    (select distinct event from dataset2 where event is not missing) as b left join
    dataset2 as c on a.ID=c.ID and b.event=c.event
union select * from dataset2 where event is missing;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;to accomodate missing events.&lt;/P&gt;</description>
    <pubDate>Fri, 16 Jul 2021 17:12:18 GMT</pubDate>
    <dc:creator>PGStats</dc:creator>
    <dc:date>2021-07-16T17:12:18Z</dc:date>
    <item>
      <title>joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754620#M238009</link>
      <description>&lt;P&gt;Hello . I need help with combining two datasets with all time points for each ID even though they are not in dataset #2:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;dataset #1: 'event' table&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;event&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;dataset#2 'id_all'&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;event&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;value&lt;/TD&gt;&lt;TD&gt;value2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5656&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;324&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6565&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;31&lt;/TD&gt;&lt;TD&gt;465&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4663&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;697&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4242&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;656&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5421&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;647&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;want:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;event&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;value&lt;/TD&gt;&lt;TD&gt;value2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5656&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;324&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5656&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5656&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6565&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6565&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;31&lt;/TD&gt;&lt;TD&gt;465&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;6565&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4663&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;697&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4663&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4663&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4242&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4242&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4242&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4242&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5421&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;647&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5421&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;5421&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;Month 1&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;Month 2&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;Month 3&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;656&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;here's my attempt so far:&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;select&amp;nbsp; a.*, b.event&lt;/P&gt;&lt;P&gt;from id_all a right join event b on a.event = b.event;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;doesn't work:(&lt;/P&gt;</description>
      <pubDate>Fri, 16 Jul 2021 16:00:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754620#M238009</guid>
      <dc:creator>pacman94</dc:creator>
      <dc:date>2021-07-16T16:00:46Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754625#M238014</link>
      <description>Change your code from a right join, which only keeps records in the right table, to a full join, where you keep records from both tables.</description>
      <pubDate>Fri, 16 Jul 2021 16:23:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754625#M238014</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2021-07-16T16:23:28Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754634#M238020</link>
      <description>&lt;P&gt;In your 'want' table, do you need that null value for event for id 4242?&lt;/P&gt;</description>
      <pubDate>Fri, 16 Jul 2021 16:38:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754634#M238020</guid>
      <dc:creator>maguiremq</dc:creator>
      <dc:date>2021-07-16T16:38:39Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754635#M238021</link>
      <description>Yes&lt;BR /&gt;</description>
      <pubDate>Fri, 16 Jul 2021 16:40:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754635#M238021</guid>
      <dc:creator>pacman94</dc:creator>
      <dc:date>2021-07-16T16:40:58Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754638#M238022</link>
      <description>&lt;P&gt;If every event is represented at least once in dataset2, you don't even need dataset1:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
select  	
	a.ID, 
	b.event,
	c.value,
	c.value2
from	
	(select distinct ID from dataset2) as a cross join
	(select distinct event from dataset2) as b left join
	dataset2 as c on a.ID=c.ID and b.event=c.event;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Edit:&amp;nbsp; Or&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
select      
    a.ID, 
    b.event,
    c.value,
    c.value2
from    
    (select distinct ID from dataset2) as a cross join
    (select distinct event from dataset2 where event is not missing) as b left join
    dataset2 as c on a.ID=c.ID and b.event=c.event
union select * from dataset2 where event is missing;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;to accomodate missing events.&lt;/P&gt;</description>
      <pubDate>Fri, 16 Jul 2021 17:12:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754638#M238022</guid>
      <dc:creator>PGStats</dc:creator>
      <dc:date>2021-07-16T17:12:18Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754642#M238025</link>
      <description>&lt;P&gt;When I ran &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats&lt;/a&gt; code (pardon me if I mistyped something), I encountered the same issue that I had before I asked you about the null value for event. It gets replicated across each ID in the output.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;id event value value2 
1234   . . 
1234 Month 1 . . 
1234 Month 2 . . 
1234 Month 3 14 656 
4242   . . 
4242 Month 1 . . 
4242 Month 2 . . 
4242 Month 3 . . 
4663   . . 
4663 Month 1 14 697 
4663 Month 2 . . 
4663 Month 3 . . 
5421   . . 
5421 Month 1 12 647 
5421 Month 2 . . 
5421 Month 3 . . 
5656   . . 
5656 Month 1 13 324 
5656 Month 2 . . 
5656 Month 3 . . 
6565   . . 
6565 Month 1 . . 
6565 Month 2 31 465 
6565 Month 3 . . 
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It's a bit odd that you have to retain that null event, but if that is what you need, here is one solution. If you need more info about the SPARSE option in PROC FREQ, look &lt;A href="https://www.lexjansen.com/nesug/nesug02/cc/cc003.pdf" target="_self"&gt;here.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'm not the best with PROC SQL, so &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/462"&gt;@PGStats&lt;/a&gt; (thanks for showing me how to do something like this with PROC SQL) may have a better solution after accounting for that weird requirement with your data.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines delimiter = "," missover;
input id $ event :$ value  value2;
datalines;
5656,Month 1,13,324
6565,Month 2,31,465
4663,Month 1,14,697
4242,,.,.
1234,Month 3,14,656
5421,Month 1,12,647
;
run;

proc freq data = have;
	tables event*id / 	out = have_2 (where = (event ^= "" or (event = "" and count = 1)))	  
						sparse;
run;

proc sql;
	select
				a.id,
				a.event,
				b.value,
				b.value2
	from
				have_2 as a
					left join
				have  as b
						on	a.id 	= b.id 		and
							a.event = b.event;
quit;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;PRE&gt;id event value value2 
1234 Month 1 . . 
1234 Month 2 . . 
1234 Month 3 14 656 
4242   . . 
4242 Month 1 . . 
4242 Month 2 . . 
4242 Month 3 . . 
4663 Month 1 14 697 
4663 Month 2 . . 
4663 Month 3 . . 
5421 Month 1 12 647 
5421 Month 2 . . 
5421 Month 3 . . 
5656 Month 1 13 324 
5656 Month 2 . . 
5656 Month 3 . . 
6565 Month 1 . . 
6565 Month 2 31 465 
6565 Month 3 . . 
&lt;/PRE&gt;</description>
      <pubDate>Fri, 16 Jul 2021 17:14:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754642#M238025</guid>
      <dc:creator>maguiremq</dc:creator>
      <dc:date>2021-07-16T17:14:37Z</dc:date>
    </item>
    <item>
      <title>Re: joining two tables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754657#M238038</link>
      <description>&lt;P&gt;You can get the final table by following proc sql few steps.&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. Get the cartesian Product of just Id and event.&lt;/P&gt;&lt;P&gt;2. Merge the step1 result with the original id_all table and get the common rows.&lt;/P&gt;&lt;P&gt;3. Get the subset from step1 which is excluded from step2 and add it back&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data event;
input event $10.;
datalines;
Month1
Month2
Month3
run;

data id_all;
infile datalines missover;
input ID event :$10. value value2;
datalines;
5656 Month1 13 324
6565 Month2 31 465
4663 Month1 14 697
4242
1234 Month3 14 656
5421 Month1 12 647
run;

proc sql;
create table subset
as
select  a.id, b.event
from id_all a,event b;
quit;

proc sql;
create table match
as
select a.id, b.event, a.value, a.value2
from id_all a
left join subset b
on a.id=b.id
and a.event=b.event
;
quit;

proc sql;
create table all
as
select * from match
union
(select id, event, . as value, . as value2 from subset
 except
 select id, event, . as value, . as value2 from match);
quit;

proc sort data=all; by id, event; run;

proc print data=all; run;&lt;/CODE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 16 Jul 2021 18:50:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/joining-two-tables/m-p/754657#M238038</guid>
      <dc:creator>Rydhm</dc:creator>
      <dc:date>2021-07-16T18:50:02Z</dc:date>
    </item>
  </channel>
</rss>

