We beginnen met het opschonen van de query. U moet altijd proberen uw berekeningen indien mogelijk voor elke rij uit te voeren in plaats van meerdere verticale subquery's uit te voeren, omdat dit voorkomt dat het DBMS meerdere passages over dezelfde tabel maakt.
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;
Ervan uitgaande dat ik nergens een komma heb geplaatst, zal dit een kolom woba
. opleveren voor elk jaar voor de opgegeven startende werper.
Merk op dat ik me heb aangesloten bij de tabellen op e.year_id
in plaats van SUBSTRING(e.game_ID,4,4)
; dit vermijdt de overhead van het aanroepen van SUBSTRING()
op elke plaat. Dit soort dingen lijkt klein, maar het kan snel oplopen aan een grote tafel.
Dat zou genoeg moeten zijn om u op weg te helpen.