As featured in: Data Management Solutions Using SAS Hash Table Operations: A Business Intelligence Case Study , and built from this github repository.
Chapter 8 Multiple Splits.sas
1 /* "Chapter 8 Multiple Splits.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 _null_;
7  /* define the lookup hash object tables */
8  dcl hash players(dataset:"dw.players(rename=(Player_ID=Batter_ID))"
9  ,multidata:"Y");
10  players.defineKey("Batter_ID");
11  players.defineData("Batter_ID","Team_SK","Last_Name","First_Name"
12  ,"Start_Date","End_Date");
13  players.defineDone();
14  dcl hash teams(dataset:"dw.teams");
15  teams.defineKey("Team_SK");
16  teams.defineData("Team_Name");
17  teams.defineDone();
18  dcl hash games(dataset:"dw.games");
19  games.defineKey("Game_SK");
20  games.defineData("Date","Month","DayOfWeek");
21  games.defineDone();
22  /* define the result hash object tables */
23  dcl hash h_pointer;
24  dcl hash byPlayer(ordered:"A");
25  byPlayer.defineKey("Last_Name","First_Name","Batter_ID");
26  byPlayer.defineData("Last_Name","First_Name","Batter_ID","PAs","AtBats","Hits"
27  ,"_Bases","_Reached_Base","BA","OBP","SLG","OPS");
28  byPlayer.defineDone();
29 
30  dcl hash byTeam(ordered:"A");
31  byTeam.defineKey("Team_SK","Team_Name");
32  byTeam.defineData("Team_Name","Team_SK","PAs","AtBats","Hits"
33  ,"_Bases","_Reached_Base","BA","OBP","SLG","OPS");
34  byTeam.defineDone();
35 
36  dcl hash byMonth(ordered:"A");
37  byMonth.defineKey("Month");
38  byMonth.defineData("Month","PAs","AtBats","Hits"
39  ,"_Bases","_Reached_Base","BA","OBP","SLG","OPS");
40  byMonth.defineDone();
41 
42  dcl hash byDayOfWeek(ordered:"A");
43  byDayOfWeek.defineKey("DayOfWeek");
44  byDayOfWeek.defineData("DayOfWeek","PAs","AtBats","Hits"
45  ,"_Bases","_Reached_Base","BA","OBP","SLG","OPS");
46  byDayOfWeek.defineDone();
47 
48  dcl hash byPlayerMonth(ordered:"A");
49  byPlayerMonth.defineKey("Last_Name","First_Name","Batter_ID","Month");
50  byPlayerMonth.defineData("Last_Name","First_Name","Batter_ID","Month"
51  ,"PAs","AtBats","Hits","_Bases","_Reached_Base"
52  ,"BA","OBP","SLG","OPS");
53  byPlayerMonth.defineDone();
54 
55  if 0 then set dw.players(rename=(Player_ID=Batter_ID))
56  dw.teams
57  dw.games;
58  format PAs AtBats Hits comma6. BA OBP SLG OPS 5.3;
59 
60  lr = 0;
61  do until(lr);
62  set dw.AtBats end = lr;
63  call missing(Team_SK,Last_Name,First_Name,Team_Name,Date,Month,DayOfWeek);
64  games.find();
65  players_rc = players.find();
66  do while(players_rc = 0);
67  if (Start_Date le Date le End_Date) then leave;
68  players_rc = players.find_next();
69  end;
70  if players_rc ne 0
71  then call missing(Team_SK,First_Name,Last_Name);
72  teams.find();
73  h_pointer = byPlayer;
74  link slashline;
75  h_pointer = byTeam;
76  link slashline;
77  h_pointer = byMonth;
78  link slashline;
79  h_pointer = byDayOfWeek;
80  link slashline;
81  h_pointer = byPlayerMonth;
82  link slashline;
83  end;
84  byPlayer.output(dataset:"byPlayer(drop=_:)");
85  byTeam.output(dataset:"byTeam(drop=_:)");
86  byMonth.output(dataset:"byMonth(drop=_:)");
87  byDayOfWeek.output(dataset:"byDayOfWeek(drop=_:)");
88  byPlayerMonth.output(dataset:"byPlayerMonth(drop=_:)");
89  stop;
90  slashline:
91  call missing(PAs,AtBats,Hits,_Bases,_Reached_Base);
92  rc = h_pointer.find();
93  PAs + 1;
94  AtBats + Is_An_AB;
95  Hits + Is_A_Hit;
96  _Bases + Bases;
97  _Reached_Base + Is_An_OnBase;
98  BA = divide(Hits,AtBats);
99  OBP = divide(_Reached_Base,PAs);
100  SLG = divide(_Bases,AtBats);
101  OPS = sum(OBP,SLG);
102  h_pointer.replace();
103  return;
104 run;
105