As featured in: Data Management Solutions Using SAS Hash Table Operations: A Business Intelligence Case Study , and built from this github repository.
Chapter 5 AssignPlayersToTeams.sas
1 /* "Chapter 5 AssignPlayersToTeams.sas" from the SAS Press book
2  Data Management Solutions Using SAS Hash Table Operations:
3  A Business Intelligence Case Study
4 */
5 
6 data positions;
7  set bizarro.positions;
8  retain DummyKey 1;
9  drop position;
10 run;
11 
12 data _null_;
13 
14  if 0 then set template.player_candidates;
15  retain Player_ID 10000 Start_Date "01MAR2017"d End_Date &SCD_End_Date;
16  format Player_ID z5. Start_Date End_Date mmddyy10.;
17  informat Start_Date End_Date yymmdd10.;
18 
19  /* load the available players */
20  declare hash available(dataset:"bizarro.player_candidates",multidata:"yes");
21  rc = available.defineKey("Position_Code");
22  rc = available.defineData("Player_ID","Team_SK","First_Name","Last_Name"
23  ,"Position_Code","Bats","Throws");
24  rc = available.defineDone();
25 
26  /* load the hash table of positions */
27  declare hash positions(dataset:"positions",multidata:"yes");
28  rc = positions.defineKey("DummyKey");
29  rc = positions.defineData("Position_Code","Count");
30  rc = positions.defineDone();
31 
32  /* load the list of teams */
33  declare hash teams(dataset:"Bizarro.teams");
34  rc = teams.defineKey("Team_SK");
35  rc = teams.defineDone();
36  declare hiter teams_iter("teams");
37 
38  DummyKey = 1;
39  pos_rc = positions.find();
40  avail_rc = available.find();
41  do until(pos_rc);
42  teams_rc = teams_iter.first();
43  do until(teams_rc);
44  Team = Team_SK;
45  do i = 1 to Count;
46  Team_SK = Team;
47  available.replaceDup();
48  avail_rc = available.find_next();
49  end;
50  teams_rc = teams_iter.next();
51  end;
52  pos_rc = positions.find_next();
53  avail_rc = available.find();
54  end;
55  rc = available.output(dataset:"bizarro.player_candidates");
56 run;
57 
58 data bizarro.trades;
59  format trade_date yymmdd10.;
60  input trade_date yymmdd10. traded_id _position_code $3. _team_sk traded_to;
61 datalines;
62 2017/06/23 10090 SP 269 115
63 2017/06/23 10753 SP 115 269
64 2017/07/26 10103 COF 171 228
65 2017/07/26 10760 COF 228 171
66 2017/08/30 10145 CF 193 130
67 2017/08/30 10732 CF 130 193
68 ;
69