Nous allons commencer par nettoyer la requête. Vous devriez toujours essayer d'effectuer vos calculs sur chaque ligne lorsque cela est possible plutôt que d'effectuer plusieurs sous-requêtes verticales, car cela évite au SGBD de faire plusieurs passages sur la même table.
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;
En supposant que je n'ai pas laissé tomber de virgule quelque part, cela renverra une colonne woba
pour chaque année pour le lanceur partant spécifié.
Notez que j'ai rejoint les tables sur e.year_id
au lieu de SUBSTRING(e.game_ID,4,4)
; cela évite la surcharge d'appel de SUBSTRING()
sur chaque enregistrement. Ce genre de chose semble mineur, mais cela peut s'accumuler rapidement sur une grande table.
Cela devrait suffire pour vous aider à démarrer.