Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benötigen Sie Hilfe beim Hinzufügen einer Spalte zu einer Tabelle mithilfe einer Funktion, die arithmetische Operationen zwischen Spalten aus zwei separaten Tabellen durchführt

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.