Kami akan mulai dengan membersihkan kueri. Anda harus selalu mencoba melakukan perhitungan di setiap baris bila memungkinkan daripada melakukan beberapa subkueri vertikal, karena ini menghindari DBMS membuat banyak lintasan pada tabel yang sama.
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;
Dengan asumsi saya belum menjatuhkan koma di suatu tempat, ini akan mengembalikan kolom woba
untuk setiap tahun untuk pelempar awal yang ditentukan.
Perhatikan bahwa saya telah bergabung dengan tabel di e.year_id
bukannya SUBSTRING(e.game_ID,4,4)
; ini menghindari overhead pemanggilan SUBSTRING()
pada setiap catatan. Hal semacam ini tampaknya kecil, tetapi dapat bertambah dengan cepat di atas meja besar.
Itu sudah cukup untuk membantu Anda memulai.