<?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: How To Get a Clean Output Table ? in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591500#M169443</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/282666"&gt;@Midi&lt;/a&gt;&amp;nbsp; wouldn't the count(distinct&amp;nbsp;&lt;SPAN&gt;Fam) for user=2563 be 2?&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Wed, 25 Sep 2019 13:15:12 GMT</pubDate>
    <dc:creator>novinosrin</dc:creator>
    <dc:date>2019-09-25T13:15:12Z</dc:date>
    <item>
      <title>How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591496#M169442</link>
      <description>&lt;P&gt;Hello Everyone , so , I have This Data Set :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;User&lt;/TD&gt;&lt;TD&gt;Orders&lt;/TD&gt;&lt;TD&gt;Fam&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1542&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2251&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1544&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2222&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2335&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And What I want to get is The Distinct Number of Fam Per User :&lt;/P&gt;&lt;P&gt;So This My Code :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
    create Table Max_Fam as
    select A*. count(distinct(Fam)) as Max_N_Fam
    from Base_For_Counts
    group by User 
	;
quit;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;And This is What I get :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;User&lt;/TD&gt;&lt;TD&gt;Orders&lt;/TD&gt;&lt;TD&gt;Fam&lt;/TD&gt;&lt;TD&gt;Num_Fam&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1542&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2251&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1544&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2222&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2335&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And What I want Is This Output :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;User&lt;/TD&gt;&lt;TD&gt;Orders&lt;/TD&gt;&lt;TD&gt;Fam&lt;/TD&gt;&lt;TD&gt;Num_Fam&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1542&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2251&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;1544&lt;/TD&gt;&lt;TD&gt;66&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2222&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2563&lt;/TD&gt;&lt;TD&gt;2335&lt;/TD&gt;&lt;TD&gt;28&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any Idea to get there ?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any Help would be much appreciated , thank you&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:06:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591496#M169442</guid>
      <dc:creator>Midi</dc:creator>
      <dc:date>2019-09-25T13:06:49Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591500#M169443</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/282666"&gt;@Midi&lt;/a&gt;&amp;nbsp; wouldn't the count(distinct&amp;nbsp;&lt;SPAN&gt;Fam) for user=2563 be 2?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:15:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591500#M169443</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2019-09-25T13:15:12Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591501#M169444</link>
      <description>&lt;P&gt;Exactly , In this Case Yes.&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:15:21 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591501#M169444</guid>
      <dc:creator>Midi</dc:creator>
      <dc:date>2019-09-25T13:15:21Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591502#M169445</link>
      <description>&lt;P&gt;So would have been nicer to post a correct sample to help folks not get confused&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data have;
input User	Orders	Fam;
cards;
2563	1542	66
2563	2251	66
2563	1544	66
2563	2222	28
2563	2335	28
;

proc sql;
    create Table Max_Fam(drop=_user) as
    select *,user as _user, count(distinct(Fam)) as Max_N_Fam
    from have
    group by _User
	;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:17:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591502#M169445</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2019-09-25T13:17:30Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591511#M169452</link>
      <description>&lt;P&gt;Thank You , but i already have this output , what i want is for the cells in common to be joined and having the max that "covers" the three of them , basically not have the max for each cell , i don't know if that was clear , thank's again&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:24:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591511#M169452</guid>
      <dc:creator>Midi</dc:creator>
      <dc:date>2019-09-25T13:24:52Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591512#M169453</link>
      <description>&lt;P&gt;Use a data step:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input User :$4. Orders Fam;
datalines;
2563 1542 66
2563 2251 66
2563 1544 66
2563 2222 28
2563 2335 28
;

data want;
count = 0;
do until (last.user);
  set have;
  by user fam notsorted;
  if first.fam then count + 1;
end;
do until (last.user);
  set have;
  by user fam notsorted;
  if first.fam
  then num_fam = count;
  else num_fam = .;
  output;
end;
drop count;
run;

proc print data=want noobs;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Result:&lt;/P&gt;
&lt;PRE&gt;User	Orders	Fam	num_fam
2563	1542	66	2
2563	2251	66	.
2563	1544	66	.
2563	2222	28	2
2563	2335	28	.
&lt;/PRE&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:25:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591512#M169453</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2019-09-25T13:25:41Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591529#M169466</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data have;
input id	Orders	Fam;
cards;
2563	1542	66
2563	2251	66
2563	1544	66
2563	2222	28
2563	2335	28
;

data temp;
set have;
rownum+1;
run;
proc sql;
create table want(drop=c rownum) as
select *,ifn(min(rownum)=rownum,c,.) as Max_N_Fam
from
(select *,count(distinct fam) as c 
from temp
group by id)
group by id,fam
order by id,rownum;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 25 Sep 2019 13:51:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591529#M169466</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2019-09-25T13:51:35Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591585#M169492</link>
      <description>Why are you doing this? If it's for display purposes, using PROC REPORT is likely a better option that creating a dataset.</description>
      <pubDate>Wed, 25 Sep 2019 15:31:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591585#M169492</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2019-09-25T15:31:37Z</dc:date>
    </item>
    <item>
      <title>Re: How To Get a Clean Output Table ?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591644#M169533</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/282666"&gt;@Midi&lt;/a&gt;:&lt;/P&gt;
&lt;P&gt;SAS is good enough to get what you want in a single step, even if the input data are completely unsorted. Note that below, a few records have been added to the sample input to make it more representative with respect to more than one user and different summary counts per user.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have ;                                        
  input User Orders Fam ;                          
  cards ;                                          
2500  1000  55                                     
2500  2000  55                                     
2500  3000  55                                     
2563  1542  66                                     
2563  2251  66                                     
2563  1544  66                                     
2563  2222  28                                     
2563  2335  28                                     
;                                                  
run ;                                              
                                                   
data want ;                                        
  if _n_ = 1 then do ;                             
    dcl hash h () ;                                
    h.definekey ("user") ;                         
    h.definedata ("num_fam", "_n_") ;              
    h.definedone () ;                              
    dcl hash u () ;                                
    u.definekey ("user", "fam") ;                  
    u.definedone () ;                              
    do until (z) ;                                 
      set have end = z ;                           
      if h.find() ne 0 then num_fam = 0 ;          
      if u.check() ne 0 then do ;                  
        num_fam + 1 ;                              
        u.add() ;                                  
      end ;                                        
      h.replace() ;                                
    end ;                                          
  end ;                                            
  set have ;                                       
  h.find() ;                                       
  if _n_ = 0 then call missing (num_fam) ;         
  else h.replace (key:user, data:num_fam, data:0) ;
run ;                                              
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;At first glance, it may look kind of complex but in actuality it's pretty simple:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The distinct counts of FAM are accumulated per user in hash table H using table U to see if a given [USER,FAM] combo has already been seen.&lt;/LI&gt;
&lt;LI&gt;These counts are matched by USER on the second pass through HAVE. If a given USER key-value hasn't already been encountered, the current record is output with non-missing NUM_FAM coming from table H, and _N_ in the corresponding item of table H is changed from the initial value of 1 to 0.&lt;/LI&gt;
&lt;LI&gt;Thus, on all subsequent encounters with the same input key-value of USER, _N_ coming from H is 0, which signals to set NUM_FAM to missing.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Of course, if your input data are already sorted by [User,Fam] (or just grouped, as in your sample), it's still much simpler, as&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/11562"&gt;@Kurt_Bremser&lt;/a&gt;&amp;nbsp;has already indicated (below, his double DoW-loop program is merely presented in a slightly different guise):&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want ;                                 
  do _n_ = 1 by 1 until (last.user) ;       
    set have ;                              
    by user fam notsorted ;                 
    Num_Fam = sum (num_fam, first.fam) ;    
  end ;                                     
  do _n_ = 1 to _n_ ;                       
    set have ;                              
    if _n_ &amp;gt; 1 then call missing (num_fam) ;
    output ;                                
  end ;                                     
run ;                                       
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Kind regards&lt;/P&gt;
&lt;P&gt;Paul D.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 25 Sep 2019 18:13:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-To-Get-a-Clean-Output-Table/m-p/591644#M169533</guid>
      <dc:creator>hashman</dc:creator>
      <dc:date>2019-09-25T18:13:56Z</dc:date>
    </item>
  </channel>
</rss>

