Puoi risolvere questo problema in puro SQL, non hai bisogno di una funzione per questo.
La cosa migliore è suddividere la raccolta delle statistiche in due query distinte, una per quando la squadra gioca in casa, l'altra quando gioca in trasferta. Per ogni partita calcola i punti ei goal segnati. Quindi UNION
queste due query e usala come sottoquery per calcolare le statistiche complessive:
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;
Questo non è particolarmente veloce a causa del CASE
istruzioni, ma sarà più veloce rispetto all'utilizzo di una procedura e di un ciclo.
Invece di inserire il risultato di questa query in una tabella, ti suggerirei di CREATE VIEW general AS ...
con la domanda di cui sopra. In tal caso ottieni sempre gli ultimi risultati quando SELECT * FROM general
e non devi TRUNCATE
la tabella generale prima di eseguire la query (l'aggiunta di nuovi risultati con i dati nella tabella violerà il vincolo PK). Se hai davvero bisogno della tabella, usa SELECT ... INTO general FROM ...
nella query precedente.