Sie können dieses Problem in reinem SQL lösen, Sie brauchen dafür keine Funktion.
Das Beste ist, die Sammlung von Statistiken in zwei unterschiedliche Abfragen aufzuteilen, eine für das Heimspiel der Mannschaft und eine für das Auswärtsspiel. Berechnen Sie für jedes Spiel die Punkte und die erzielten Tore. Dann UNION
diese beiden Abfragen und verwenden Sie diese als Unterabfrage, um die Gesamtstatistik zu berechnen:
SELECT
eq.nom_equipo AS equipo,
COUNT(p.*) AS partidos_jug,
SUM(CASE WHEN p.puntos = 3 THEN 1 ELSE 0 END) partidos_gana,
SUM(CASE WHEN p.puntos = 1 THEN 1 ELSE 0 END) partidos_emp,
SUM(CASE WHEN p.puntos = 0 THEN 1 ELSE 0 END) partidos_perd,
SUM(p.puntos) AS puntos,
SUM(p.goles) AS goles_favor
FROM equipos eq
JOIN (
-- Playing at home
SELECT
num_eqpo_loc AS eqpo,
CASE WHEN (goles_loc > goles_vis) THEN 3
WHEN (goles_loc = goles_vis) THEN 1
ELSE 0
END AS puntos,
goles_loc AS goles
FROM partidos
UNION
-- Playing away
SELECT
num_eqpo_vis AS eqpo,
CASE WHEN (goles_vis > goles_loc) THEN 3
WHEN (goles_vis = goles_loc) THEN 1
ELSE 0
END AS puntos,
goles_vis AS goles
FROM partidos) AS p ON p.eqpo = eq.num_eqpo
GROUP BY equipo
ORDER BY puntos DESC, partidos_jug ASC, goles_favor DESC;
Dies ist aufgrund des CASE
nicht besonders schnell Anweisungen, aber es ist schneller als die Verwendung einer Prozedur und einer Schleife.
Anstatt das Ergebnis dieser Abfrage in eine Tabelle zu schreiben, würde ich vorschlagen, dass Sie CREATE VIEW general AS ...
erstellen mit obiger Abfrage. In diesem Fall erhalten Sie immer die neuesten Ergebnisse, wenn Sie SELECT * FROM general
und Sie müssen nicht TRUNCATE
die allgemeine Tabelle, bevor Sie die Abfrage ausführen (das Hinzufügen neuer Ergebnisse mit Daten in der Tabelle verstößt gegen die PK-Einschränkung). Wenn Sie die Tabelle wirklich brauchen, verwenden Sie SELECT ... INTO general FROM ...
in der Abfrage oben.