Começaremos limpando a consulta. Você deve sempre tentar realizar seus cálculos em cada linha quando possível, em vez de realizar várias subconsultas verticais, pois isso evita que o DBMS faça várias passagens na mesma tabela.
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;
Supondo que eu não tenha soltado uma vírgula em algum lugar, isso retornará uma coluna
woba
para cada ano para o lançador inicial especificado. Observe que juntei as tabelas em
e.year_id
em vez de SUBSTRING(e.game_ID,4,4)
; isso evita a sobrecarga de chamar SUBSTRING()
em cada registro. Esse tipo de coisa parece menor, mas pode aumentar rapidamente em uma mesa grande. Isso deve ser suficiente para você começar.