%INCLUDE 'MK1U.RAD.DDNAMES(OPTS80)';
 *OPTIONS MPRINT MLOGIC SOURCE2;
 FILENAME DATAHSB 'MK1U.RAD.AGENCY.HSB.AGCYSTD';
 FILENAME DATATAR 'MK1U.RAD.AGENCY.AGENCY.AGCYUNQI';
 FILENAME ELIMNAME 'CPATRID.PRIVATE.CNTL(ELIMNAME)';
 FILENAME ELIMADDR 'CPATRID.PRIVATE.CNTL(ELIMADDR)';
 FILENAME AGTSTATE 'CPATRID.PRIVATE.CNTL(AGTSTATE)';
 FILENAME AGTSTAT1 'CPATRID.PRIVATE.CNTL(AGTSTAT1)';
 LIBNAME  SASMATCH V606 'MK1U.RAD.AGENCY.SAS.DATASETS' DISP=OLD;
 FILENAME OUTPRT   'MK1U.RAD.AGENCY.AGENT.MATCH1'  DISP=OLD;
 FILENAME MATCHED  'MK1U.RAD.AGENCY.AGENT.MATCH2'  DISP=SHR;
 FILENAME PRIORMAT 'MK1U.RAD.AGENCY.AGENT.MATCH3'  DISP=OLD;

 ** AGENT MATCH1 IS USED TO PRINT A FILE LISTING THOSE AGENTS WHICH ;
 ** MIGHT BE THE SAME;
 ** AGENT MATCH2 IS USED TO MATCH AGAINST ANY NEW AGENTS COMING IN to;
 ** TO SEE IF A PRIOR MATCH WAS FOUND AND AN HSB PRODUCER WAS ASSIGN;
 ** AGENT MATCH3 IS USED TO TEMPORARILY HOLD THE NEW AND PRIOR AGENTS;
 ** THAT WERE NOT MATCHED AND NO HSB PRODUCER WAS ASSIGNED.  THIS ;
 ** FILE HAS TO BE ADDED TO AGENT MATCH2 FILE BEFORE ANY UPDATING OF;
 ** HSB PRODUCER NUMBER IS ASSIGNED;

 ** SPLIT PRIOR MATCHING FILE;
 ** PRIORMAT FILE WILL BE THOSE AGENTS THAT HAVE BEEN ASSIGNED AN HSB;
 ** PRODUCER NUMBER;
 ** UNMATCH FILE WILL BE THOSE AGENTS THAT HAVE NOT BEEN ASSIGNED AN;
 ** HSB PRODUCER NUMBER, AND WILL BE SENT THROUGH AGAIN FOR ANOTHER;
 ** ROUND OF MATCHING IN CASE HSB PRODUCER FILE HAS BEEN UPDATED;

 DATA PRIORMAT
      UNMATCH   ;
  INFILE MATCHED;
  INPUT @1   HSBCODE  $ 7.
        @8   SPECIAL  $20.
        @28  TARCODE  $20.
        @58  DWRITER  $ 1.
        @61  TARNAME1 $45.
        @106 TARNAME2 $45.
        @151 TARADDR  $45.
        @196 TARCITY  $45.
        @241 TARSTATE $ 2.
        @243 TARZIP   $ 5.
        @243 TSORTZIP $ 3.
        @8   TARPART1   $CHAR200.
        @208 TARPART2   $CHAR71.
        @276 COMPCODE   3. ;

 IF COMPCODE = 075 AND DWRITER = ' ' THEN DWRITER = 'D' ;
 IF COMPCODE = 096 AND DWRITER = ' ' THEN DWRITER = 'D' ;
 IF COMPCODE = 076 AND DWRITER = ' ' THEN DWRITER = 'D' ;
 IF DWRITER = 'D' THEN SPECIAL = 'DIRECT WRITER';

 IF COMPCODE = 34 THEN DO;
    IF SPECIAL = ' ' THEN DO;
      IF '1'    = SUBSTR(TARCODE,1,1) THEN SPECIAL = 'DISTRICT AGENT';
      IF '2'    = SUBSTR(TARCODE,1,1) THEN SPECIAL = 'ORDINARY AGENT';
      IF '0065' = SUBSTR(TARCODE,1,4) THEN SPECIAL = 'DIRECT WRITER ';
      IF '0066' = SUBSTR(TARCODE,1,4) THEN SPECIAL = 'DIRECT WRITER ';
      IF '0068' = SUBSTR(TARCODE,1,4) THEN SPECIAL = 'DIRECT WRITER ';
      IF '0070' = SUBSTR(TARCODE,1,4) THEN SPECIAL = 'DIRECT WRITER ';
    END;
 END;

  IF HSBCODE = '_______' THEN OUTPUT UNMATCH ;
                         ELSE OUTPUT PRIORMAT;

 ** PUT THOSE PRIOR MATCHES THAT HAVE BEEN ASSIGNED AN HSB PRODUCER;
 **    NUMBER INTO THE AGENT MATCH3 FILE TO BE USED TO REPLACE PRIOR;
 **    MATCH FILE AGENT MATCH2;

 DATA _NULL_;
  SET PRIORMAT;
   FILE PRIORMAT NOPRINT NOTITLES;
   PUT @1 HSBCODE $7. @8 TARPART1 $CHAR200. @208 TARPART2 $CHAR71. ;
  RETURN;

 DATA TARGET;
  INFILE DATATAR;
  INPUT
        @15  TARCODE  $20.
        @58  DWRITER  $ 1.
        @54  TARNAME1 $45.
        @99  TARNAME2 $45.
        @144 TARADDR  $45.
        @189 TARCITY  $45.
        @234 TARSTATE $ 2.
        @236 TARZIP   $ 5.
        @236 TSORTZIP $ 3.
        @1   TARPART1 $CHAR200.
        @201 TARPART2 $CHAR71.
        @269 COMPCODE   3. ;

  NUMERIC = INPUT(TARZIP,5.);
  IF NUMERIC = . THEN DELETE;

  PROC SORT DATA=PRIORMAT  OUT=PRIORMAT; BY COMPCODE TARCODE;
  PROC SORT DATA=TARGET    OUT=TARGET  ; BY COMPCODE TARCODE;

 ** MATCH ANY NEW INCOMING AGENT RECORDS WITH THOSE THAT HAVE BEEN ;
 **    ALREADY MATCHED AND ASSIGNED.  NO NEED TO MATCH AGAIN       ;

  DATA TARGET;
   MERGE TARGET (IN=T) PRIORMAT (IN=P);
   BY COMPCODE TARCODE;
   IF  T AND  P THEN DELETE; ** NEW RECORD MATCHED WITH PRIOR MATCH;
   IF not t AND  P THEN DELETE; ** PRIOR MATCH RECORD WITH NO MATCHES ;

 PROC DATASETS LIBRARY=WORK; DELETE PRIORMAT;

 ** APPEND THE NEW INCOMING AGENT RECORDS WITH THOSE PRIOR AGENT   ;
 **   RECORDS THAT HAVE NOT BEEN ASSIGNED                          ;

  DATA TARGET;
   SET TARGET UNMATCH;

 PROC DATASETS LIBRARY=WORK; DELETE UNMATCH;

  PROC SORT DATA=TARGET    OUT=TARGET  ; BY COMPCODE TARCODE SPECIAL;

 ** SELECT ONLY 1 UNIQUE AGENT RECORD PER COMPANY PER AGENT CODE;

 DATA TARGET;
  SET TARGET;
  BY COMPCODE TARCODE;
  IF  LAST.TARCODE;
 run;

 PROC FORMAT;
 VALUE $STATECO
 "AR","AL","AZ","AK","CA","CO","CT","DE","DC","FL","GA","HI","IA","ID",
"IL","IN","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE",
"NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","
TN","TX","UT","VT","VA","WA","WV","WI","WY"=" "
 OTHER = "??";

 ** NOW READ THE HSB MASTER PRODUCER FILE;
 ** CHECK TO SEE IF STATE POSTAL CODE IS VALID, IF NOT ASSIGN POSTAL;
 **   CODE BASED ON THE ZIPCODE USING THE ZIPSTATE FUNCTION;

 DATA HSB;
  INFILE DATAHSB;
  INPUT @1   SCRCODE  $ 7.
        @8   SCRNAME  $40.
        @48  SCRSTR1  $70.
        @118 SCRCITY  $23.
        @141 SCRSTATE $ 2.
        @143 SCRZIP   $ 5.
        @143 SORTZIP  $ 3.;
  IF '??' = PUT(SCRSTATE,STATECO2.) THEN SCRSTATE = ZIPSTATE(SCRZIP);

 PROC SORT DATA=HSB     OUT=HSB    ; BY SORTZIP SCRZIP SCRNAME;
 PROC SORT DATA=TARGET  OUT=TARGET ;
     BY COMPCODE TSORTZIP TARZIP TARNAME1;

 ** SPLIT THE HSB MASTER PRODUCER FILE BY STATE BASED ON THE STATE  ;
 **   CODE OF EACH AGENT RECORD.  MIGHT WANT TO CHANGE LATER BASED  ;
 **   ZIP CODE WHERE STATE CODE IS NOT VALID                        ;

 DATA HSB AL AR AZ CA CO CT FL GA IA ID IL IN KS KY LA MA MD ME MI MN
MO MS MT NC ND NE NH NJ NM NV NY OH OK OR PA RI SC SD TN TX VA WA WI;
  SET HSB;
  BY SORTZIP;
  %INCLUDE AGTSTAT1;
 ** START THE MATCHING PROCESS;
 **  MATCH AGENT RECORD ( NAME1 ) AGAINST HSB PRODUCER NAME;

 DATA NOMATCH SAVE1;
   DO P = 1 TO TAR;
    SET TARGET NOBS=TAR POINT=P;
    IF _ERROR_ = 1 THEN ABORT;
    H = 1;
    HIT = 0;
       DO H = 1 TO HSB;
          %INCLUDE AGTSTATE;
          IF _ERROR_ = 1 THEN ABORT;
          CNTMATCH = 0;
          CNTZIP   = 0;
          ** CHECK TO SEE IF ZIP CODE IS CLOSE TO HSB ZIP CODE;
      IF (SUBSTR(TARZIP,1,3) ne (SUBSTR(SCRZIP,1,3)) THEN GOTO STARTOVR;
             CNTZIP = 1;
          ** FIND A MATCH BASED ON AGENCY 1 NAME;
             DO WORD = 1 TO 20;
               IF WORD = 1 THEN SUBTRACT = 0;
               SEARCH = SCAN(SCRNAME,WORD,' ');
               IF SEARCH='AGY'   OR SEARCH='CO'   OR SEARCH='INS'
               OR SEARCH='ASSOC' OR SEARCH='INC'  OR SEARCH='OF'
               OR SEARCH='SVCS'  OR SEARCH='CORP' THEN SUBTRACT + 1 ;
               IF ' ' = SCAN(SCRNAME,WORD,' ') THEN NWORD = WORD - 1;
               IF ' ' = SCAN(SCRNAME,WORD,' ') THEN GOTO DONE1;
             END;
   DONE1:    IF NWORD    = . THEN NWORD    = 0;
             IF SUBTRACT = . THEN SUBTRACT = 0;
             NWORD = NWORD + (-1 * SUBTRACT);

             DO WORD = 1 TO 20;
               IF WORD = 1 THEN SUBTRACT = 0;
               SEARCH = SCAN(TARNAME1,WORD,' ');
               %INCLUDE ELIMNAME;
                                                  THEN SUBTRACT +  1 ;
               IF ' ' = SCAN(TARNAME1,WORD,' ') THEN TWORD = WORD - 1;
               IF ' ' = SCAN(TARNAME1,WORD,' ') THEN GOTO DONE2;
             END;
   DONE2:    IF TWORD    = . THEN TWORD    = 0;
             IF SUBTRACT = . THEN SUBTRACT = 0;
             TWORD = TWORD + (-1 * SUBTRACT);

             DO WORD = 1 TO TWORD;
                SEARCH = SCAN(TARNAME1,WORD,' ');
                IF LENGTH(TRIM(SEARCH)) = 1 AND SEARCH Ý= ' ' THEN
                SEARCH=TRIM(SEARCH)|| ' ' ||SCAN(TARNAME1,WORD+1,' ');
                IF LENGTH(TRIM(SEARCH)) = 1 THEN GOTO ENDNAME1;
                %INCLUDE ELIMNAME;
                OR SEARCH=' '                        THEN GOTO
ENDNAME1;
                IF 0 NE INDEX(SCRNAME,TRIM(SEARCH))   THEN GOTO FOUND;
                SQZESRCH= TRIM(COMPRESS(SEARCH,'AEIOUY'));
                IF LENGTH(TRIM(SQZESRCH)) le 1 THEN GOTO ENDNAME1;
                SQZESCR = TRIM(COMPRESS(SCRNAME,'AEIOUY'));
                IF  0= INDEX(SQZESCR,TRIM(SQZESRCH)) THEN GOTO
ENDNAME1;
                FOUND:
                CNTMATCH + 1;
                HIT + 1 ;
             ENDNAME1: END;
             IF CNTMATCH gt 0 THEN DO;
                MCNT1 = CNTMATCH;
                TCNT1 = TWORD;
                WCNT1 = NWORD;
                OUTPUT SAVE1;
             END;
     STARTOVR:IF H ge HSB THEN GOTO GETNEXT; END;
   GETNEXT: IF H ge HSB THEN H= 1; OUTPUT NOMATCH;
   IF _ERROR_ = 1 THEN _ERROR_ = 0;
  END;
 STOP;
 RUN;

 ** START THE MATCHING PROCESS;
 **  MATCH AGENT RECORD ( NAME2 ) AGAINST HSB PRODUCER NAME;

 DATA NOMATCH1 SAVE2;
   DO P = 1 TO TAR;
    SET NOMATCH NOBS=TAR POINT=P;
    IF _ERROR_ = 1 THEN ABORT;
    H = 1;
    HIT = 0;
       DO H = 1 TO HSB;
          %INCLUDE AGTSTATE;
          IF _ERROR_ = 1 THEN ABORT;
          CNTMATCH = 0;
          CNTZIP   = 0;
          ** CHECK TO SEE IF ZIP CODE IS CLOSE TO HSB ZIP CODE;
        IF (SUBSTR(TARZIP,1,3)) ne (SUBSTR(SCRZIP,1,3)) THEN GOTO STARTOVR;
             CNTZIP = 1;
          ** FIND A MATCH BASED ON AGENCY 2 NAME;
             DO WORD = 1 TO 20;
               IF WORD = 1 THEN SUBTRACT = 0;
               SEARCH = SCAN(SCRNAME,WORD,' ');
               IF SEARCH='AGY'   OR SEARCH='CO'   OR SEARCH='INS'
               OR SEARCH='ASSOC' OR SEARCH='INC'  OR SEARCH='OF'
               OR SEARCH='SVCS'  OR SEARCH='CORP' THEN SUBTRACT + 1 ;
               IF ' ' = SCAN(SCRNAME,WORD,' ') THEN NWORD = WORD - 1;
               IF ' ' = SCAN(SCRNAME,WORD,' ') THEN GOTO DONE1;
             END;
   DONE1:    IF NWORD    = . THEN NWORD    = 0;
             IF SUBTRACT = . THEN SUBTRACT = 0;
             NWORD = NWORD + (-1 * SUBTRACT);

             DO WORD = 1 TO 20;
               IF WORD = 1 THEN SUBTRACT = 0;
               SEARCH = SCAN(TARNAME2,WORD,' ');
               %INCLUDE ELIMNAME;
                                                  THEN SUBTRACT +  1 ;
               IF ' ' = SCAN(TARNAME2,WORD,' ') THEN TWORD = WORD - 1;
               IF ' ' = SCAN(TARNAME2,WORD,' ') THEN GOTO DONE2;
             END;
   DONE2:    IF TWORD    = . THEN TWORD    = 0;
             IF SUBTRACT = . THEN SUBTRACT = 0;
             TWORD = TWORD + (-1 * SUBTRACT);

             DO WORD = 1 TO TWORD;
                SEARCH = SCAN(TARNAME2,WORD,' ');
                IF LENGTH(TRIM(SEARCH)) = 1 AND SEARCH Ý= ' ' THEN
                SEARCH=TRIM(SEARCH)|| ' '|| SCAN(TARNAME2,WORD+1,' ');
                IF LENGTH(TRIM(SEARCH)) = 1 THEN GOTO ENDNAME1;
                %INCLUDE ELIMNAME;
                OR SEARCH=' '               THEN GOTO ENDNAME1;
                %INCLUDE ELIMADDR;
                OR SEARCH=' '               THEN GOTO ENDNAME1;
                IF 0 NE INDEX(SCRNAME,TRIM(SEARCH))   THEN GOTO FOUND;
                SQZESRCH= TRIM(COMPRESS(SEARCH,'AEIOUY'));
                IF LENGTH(TRIM(SQZESRCH)) le 1 THEN GOTO ENDNAME1;
                SQZESCR = TRIM(COMPRESS(SCRNAME,'AEIOUY'));
                IF 0=INDEX(SQZESCR,TRIM(SQZESRCH)) THEN GOTO ENDNAME1;
                FOUND:
                CNTMATCH + 1;
                HIT + 1 ;
             ENDNAME1: END;
             IF CNTMATCH gt 0 THEN DO;
                MCNT2 = CNTMATCH;
                TCNT2 = TWORD;
                WCNT2 = NWORD;
                OUTPUT SAVE2;
             END;
     STARTOVR:IF H ge HSB THEN GOTO GETNEXT; END;
   GETNEXT: IF H ge HSB THEN H= 1; OUTPUT NOMATCH1;
   IF _ERROR_ = 1 THEN _ERROR_ = 0;
  END;
 STOP;
More code - needed