BookmarkSubscribeRSS Feed
willow2010
Calcite | Level 5

I have a piece of SAS code:

DATA EANEADTGP(KEEP=            ID       DATE_LAST_EARNING                   AMOUNT_LAST_EARNING       

                                                                PHONE_LAST_EMPLOYER            EARN_ID                      

                                                                TOTAL_AMOUNT_LAST_EARNING                         

                                                                FULL_LIST_PHONE_LAST_EMPLOYER)                    

;                                                                

  LENGTH              TOTAL_AMOUNT_LAST_EARNING          8                           

                             FULL_LIST_PHONE_LAST_EMPLOYER  $130                        

     ;                                                                

  SET EANEADTBUILDUP ;                                                

  BY ID    DATE_LAST_EARNING ;                                          

  IF FIRST.DATE_LAST_EARNING THEN DO ;                                

     TOTAL_AMOUNT_LAST_EARNING = 0 ;                                  

     FULL_LIST_PHONE_LAST_EMPLOYER = '*' ;                            

  END ;                                                               

  LAGEARN_ID=LAG(EARN_ID) ;                                           

  IF LAGEARN_ID NE EARN_ID THEN DO ;                                  

     TOTAL_AMOUNT_LAST_EARNING + AMOUNT_LAST_EARNING ;                

     FULL_LIST_PHONE_LAST_EMPLOYER=TRIM(FULL_LIST_PHONE_LAST_EMPLOYER)

                                                                                ||'/'||TRIM(PHONE_LAST_EMPLOYER) ; 

  END;

  ELSE DO;                                                

     TOTAL_AMOUNT_LAST_EARNING = AMOUNT_LAST_EARNING ;    

     FULL_LIST_PHONE_LAST_EMPLOYER = PHONE_LAST_EMPLOYER ;

  END;                                                    

RETURN ;                   

And here is some of my output (some field contents are being modified and PHONE_LAST_EMPLOYER is a $15 field):

                                FULL_LIST_      DATE_                    

TOTAL_AMOUNT_   PHONE_LAST_     LAST_     AMOUNT_LAST_   PHONE_LAST_

LAST_EARNING   EMPLOYER        EARNING       EARNING      EMPLOYER        ID        EARN_ID   

                                                            

      9000       */12345678      20091125         9000    12345678       111111111      13

     32300        /_             20091125        23300    _              111111111      18  

     40300        /_             20091125         8000    _              111111111      19  

     10000       */_             20070926        10000    _              222222222      3  

     10000       _               20070926        10000    _              222222222      3  

     20000        /_             20070926        10000    _              222222222      4  

     22800        /_             20070926         2800    _              222222222      5   

     13500       */0788884444    20100326        13500    0788884444     333333333      10  

     73500        /_             20100326        60000    _              333333333      11  

     96000        /_             20100326        22500    _              333333333      12   

    124050        /0766446644    20100326        28050        0766446644     333333333      9  

          

Looks like the TOTAL_AMOUNT_LAST_EARNING works. E.g., looks at the 4th to 8th records: Both 4th and 5th have the TOTAL_AMOUNT = 10000 as for the AMOUNT because the EARN_ID changes not. 6th has TOTAL_AMOUNT = 20000 (10000 + 10000) and 7th has TOTAL_AMOUNT=22800(10000+10000+2800).

However FULL_LIST_PHONE_LAST_EMPLOYER does not seem to have what I expected in return. E.g., the last record I expect to be: */0788884444/_/_/0766446644 and it’s not happening. (At this stage I’m really not fuzzy in getting rid of ‘_’)  And yet looks like FULL_LIST can only get the PHONE_LAST_EMPLOYER from the current record and forget everything else in the past or being reset as ‘ ‘.  How did it happen? Do I need to make FULL_LIST_PHONE_LAST_EMPLOYER into some sort of array or nested loop??  

2 REPLIES 2
andreas_lds
Jade | Level 19

The variable FULL_LIST_PHONE_LAST_EMPLOYER is reset to missing in each iteration, to preserve the value you need to add a retain statement:

length ....;

retain FULL_LIST_PHONE_LAST_EMPLOYER;

SET EANEADTBUILDUP ; 

...

art297
Opal | Level 21

While Andreas already answered your question, I thought you might find it equally useful to know that the reason that you don't have to include Total_Amount_Last_Learning in a retain statement is because it is automatically retained because you used in the statement TOTAL_AMOUNT_LAST_EARNING + AMOUNT_LAST_EARNING ;  

The variable on the left in such sum statements are automatically retained.


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
  • 805 views
  • 0 likes
  • 3 in conversation