As featured in: Data Management Solutions Using SAS Hash Table Operations: A Business Intelligence Case Study , and built from this github repository.
Chapter 11 Frontal Attack Join.sas
1 /* "Chapter 11 Frontal Attack Join.sas" from the SAS Press book
2  Data Management Solutions Using SAS Hash Table Operations:
3  A Business Intelligence Case Study
4 */
5 
6 %let comp_keys = Game_SK Inning Top_Bot AB_Number ;
7 %let data_vars = Batter_ID Is_A_Hit Result ;
8 %let data_list = %sysfunc (tranwrd (&data_vars, %str( ), %str(,))) ;
9 
10 data Join_Runs_AtBats (drop = _: Runs) ;
11  if _n_ = 1 then do ;
12  dcl hash h (multidata:"Y", ordered:"A") ;
13  do _k = 1 to countw ("&comp_keys") ;
14  h.defineKey (scan ("&comp_keys", _k)) ;
15  end ;
16  do _k = 1 to countw ("&data_vars") ;
17  h.defineData (scan ("&data_vars", _k)) ;
18  end ;
19  h.defineDone() ;
20  do until (LR) ;
21  set dw.AtBats (keep=&comp_keys &data_vars Runs
22  where=(Runs)) end = LR ;
23  h.add() ;
24  end ;
25  end ;
26  set dw.Runs ;
27  call missing (&data_list, _count) ;
28  do while (h.do_over() = 0) ;
29  _count = sum (_count, 1) ;
30  output ;
31  end ;
32  if not _count then output ;
33 run ;