Wir beginnen mit der Bereinigung der Abfrage. Sie sollten immer versuchen, Ihre Berechnungen nach Möglichkeit über jede Zeile hinweg durchzuführen, anstatt mehrere vertikale Unterabfragen durchzuführen, da dies vermeidet, dass das DBMS dieselbe Tabelle mehrfach durchläuft.
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;
Angenommen, ich habe kein Komma irgendwo weggelassen, wird dies eine Spalte woba
zurückgeben für jedes Jahr für den angegebenen Startkrug.
Beachten Sie, dass ich die Tabellen auf e.year_id
hinzugefügt habe statt SUBSTRING(e.game_ID,4,4)
; dies vermeidet den Overhead des Aufrufs von SUBSTRING()
auf jeder Platte. So etwas scheint unbedeutend, kann sich aber an einem großen Tisch schnell summieren.
Das sollte für den Anfang reichen.