Zaczniemy od uporządkowania zapytania. Zawsze powinieneś starać się wykonywać obliczenia w każdym wierszu, jeśli to możliwe, zamiast wykonywać wiele podzapytań w pionie, ponieważ pozwala to uniknąć wielokrotnych przejść DBMS nad tą samą tabelą.
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;
Zakładając, że nie upuściłem gdzieś przecinka, zwróci to kolumnę woba
za każdy rok dla określonego miotacza startowego.
Zauważ, że dołączyłem do stołów na e.year_id
zamiast SUBSTRING(e.game_ID,4,4)
; pozwala to uniknąć narzutu wywołania SUBSTRING()
na każdym rekordzie. Takie rzeczy wydają się drobne, ale mogą szybko się sumować przy dużym stole.
To powinno wystarczyć, aby zacząć.