BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Teja5b8
Calcite | Level 5

I am trying to automate a manual task which I do with Filters in Excel.

 

Data A;

Input ID ENDDT NM1 $ NM2 $;

datalines;

123 2/28/2018 Roxy Yen

124 3/23/2018 Roxy Yen

125 1/3/3018 Max Nancy

126 2/20/2016 Yen Ungrouped

127 3/4/2014 Yen Ungrouped

128 1/12/2012 Nancy Ungrouped

129 2/26/2016 Jeff Steve

130 3/22/2017 Max Nancy

;

 

Step 1 - When there is ungrouped in Nm2, it should take NM1 of that row and check if the same name exists in NM2 in some other row, then Ungrouped should be replaced with that value(Ex - For row 126 Ungrouped should be replaced with Yen from either 123 or 124)

 

Step 2 - After NM2 replacement, NM1 of that row must be replaced with NM1 from which previous NM2 replacement happened(Ex- For row 126 Yen should be replaced by Roxy)

 

Similarly For ID 128, Ungrouped should be replaced with Nancy by checking either rows 125 or 130 and Nancy in NM1 should be replaced with Max.

 

Finally there should not be any ungrouped values in NM2, if there is no match found from previous rows, it should print a message with all ID's.

 

The dataset should look like this in the end

 

 

123 2/28/2018 Roxy Yen

124 3/23/2018 Roxy Yen

125 1/3/3018 Max Nancy

126 2/20/2016 Roxy Yen

127 3/4/2014 Roxy Yen

128 1/12/2012 Max Nancy

129 2/26/2016 Jeff Steve

130 3/22/2017 Max Nancy

 

Please let me know, how can I do this using general SAS programming. Any help would be highly appreciated.

1 ACCEPTED SOLUTION

Accepted Solutions
ChrisNZ
Tourmaline | Level 20

Without knowing much about your data, this works:


proc sql;
   select a.ID
         ,a.ENDDT
         ,coalesce(b.NM1,a.NM1)  as NM1
         ,coalesce(b.NM2,a.NM2)  as NM2
   from HAVE        a
        left join
        (select unique NM1, NM2 from HAVE where NM2 ne 'Ungrouped') b 
        on  a.NM2 = 'Ungrouped'
        and a.NM1 = b.NM2
   order by ID ;
quit;
ID ENDDT NM1 NM2
123 28-Feb-18 Roxy Yen
124 23-Mar-18 Roxy Yen
125 3-Jan-18 Max Nancy
126 20-Feb-16 Roxy Yen
127 4-Mar-14 Roxy Yen
128 12-Jan-12 Max Nancy
129 26-Feb-16 Jeff Steve
130 22-Mar-17 Max Nancy

 

 

View solution in original post

2 REPLIES 2
ChrisNZ
Tourmaline | Level 20

Without knowing much about your data, this works:


proc sql;
   select a.ID
         ,a.ENDDT
         ,coalesce(b.NM1,a.NM1)  as NM1
         ,coalesce(b.NM2,a.NM2)  as NM2
   from HAVE        a
        left join
        (select unique NM1, NM2 from HAVE where NM2 ne 'Ungrouped') b 
        on  a.NM2 = 'Ungrouped'
        and a.NM1 = b.NM2
   order by ID ;
quit;
ID ENDDT NM1 NM2
123 28-Feb-18 Roxy Yen
124 23-Mar-18 Roxy Yen
125 3-Jan-18 Max Nancy
126 20-Feb-16 Roxy Yen
127 4-Mar-14 Roxy Yen
128 12-Jan-12 Max Nancy
129 26-Feb-16 Jeff Steve
130 22-Mar-17 Max Nancy

 

 

Teja5b8
Calcite | Level 5

Thanks Chris. Appreciate your support.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 2203 views
  • 0 likes
  • 2 in conversation