Comenzaremos limpiando la consulta. Siempre debe intentar realizar sus cálculos en cada fila cuando sea posible en lugar de realizar varias subconsultas verticales, ya que esto evita que el DBMS realice varias pasadas sobre la misma tabla.
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;
Suponiendo que no he dejado caer una coma en alguna parte, esto devolverá una columna woba
por cada año para el lanzador abridor especificado.
Tenga en cuenta que me uní a las tablas en e.year_id
en lugar de SUBSTRING(e.game_ID,4,4)
; esto evita la sobrecarga de llamar a SUBSTRING()
en cada registro. Este tipo de cosas parece menor, pero puede sumarse rápidamente en una mesa grande.
Eso debería ser suficiente para empezar.