Vous pouvez résoudre ce problème en SQL pur, vous n'avez pas besoin d'une fonction pour cela.
La meilleure chose à faire est de diviser la collecte de statistiques en deux requêtes distinctes, une pour quand l'équipe joue à domicile, une quand elle joue à l'extérieur. Pour chaque match, calculez les points et les buts marqués. Puis UNION
ces deux requêtes et utilisez-les comme sous-requête pour calculer les statistiques globales :
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;
Ce n'est pas particulièrement rapide en raison du CASE
instructions, mais ce sera plus rapide que d'utiliser une procédure et une boucle.
Au lieu de mettre le résultat de cette requête dans un tableau, je suggérerais que vous CREATE VIEW general AS ...
avec la requête ci-dessus. Dans ce cas, vous obtenez toujours les derniers résultats lorsque vous SELECT * FROM general
et vous n'avez pas à TRUNCATE
la table générale avant d'exécuter la requête (l'ajout de nouveaux résultats avec des données dans la table violera la contrainte PK). Si vous avez vraiment besoin de la table, utilisez SELECT ... INTO general FROM ...
dans la requête ci-dessus.