Mysql
 sql >> Base de données >  >> RDS >> Mysql

besoin d'aide pour ajouter une colonne à une table à l'aide d'une fonction qui effectue des opérations arithmétiques entre les colonnes de deux tables distinctes

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.