Vi börjar med att rensa upp frågan. Du bör alltid försöka utföra dina beräkningar över varje rad när det är möjligt istället för att utföra flera vertikala underfrågor, eftersom detta undviker att DBMS gör flera övergångar över samma tabell.
SELECT
(
( (g.wbb * SUM(IF(e.event_cd = 14, 1, 0)))
+ (g.whbp * SUM(IF(e.event_cd = 16, 1, 0)))
+ (g.w1b * SUM(IF(e.event_cd = 20, 1, 0)))
+ (g.w2b * SUM(IF(e.event_cd = 21, 1, 0)))
+ (g.w3b * SUM(IF(e.event_cd = 22, 1, 0)))
+ (g.whr * SUM(IF(e.event_cd = 23, 1, 0)))
)
/
(
SUM(IF(e.ab_fl = 'T', 1, 0))
+ SUM(IF(e.event_cd = 14, 1, 0))
+ SUM(IF(e.sf_fl = 'T', 1, 0))
+ SUM(IF(e.event_cd = 16, 1, 0))
)
) AS woba
FROM events e, guts g
WHERE e.year_id = g.season_id
AND e.pit_start_fl = 'T'
AND e.pit_id = starting_pitcher
GROUP BY g.season;
Förutsatt att jag inte har släppt ett kommatecken någonstans kommer detta att returnera en kolumn woba
för varje år för den angivna startkannan.
Observera att jag har gått med i tabellerna på e.year_id
istället för SUBSTRING(e.game_ID,4,4)
; detta undviker omkostnader för att anropa SUBSTRING()
på varje skiva. Den här typen av saker verkar mindre, men det kan snabbt lägga sig över ett stort bord.
Det borde räcka för att du ska komma igång.