Je kunt dit probleem oplossen in pure SQL, je hebt hier geen functie voor nodig.
Het beste is om de verzameling statistieken op te splitsen in twee afzonderlijke zoekopdrachten, één voor wanneer het team thuis speelt en één wanneer ze uitspelen. Bereken voor elk spel de punten en de gescoorde doelpunten. Dan UNION
die twee zoekopdrachten en gebruik die als een subquery om de algemene statistieken te berekenen:
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;
Dit is niet bijzonder snel vanwege de CASE
instructies, maar het zal sneller zijn dan het gebruik van een procedure en een lus.
In plaats van het resultaat van deze zoekopdracht in een tabel te plaatsen, raad ik u aan CREATE VIEW general AS ...
met bovenstaande vraag. In dat geval krijg je altijd de laatste resultaten als je SELECT * FROM general
en je hoeft niet te TRUNCATE
de algemene tabel voordat de query wordt uitgevoerd (het toevoegen van nieuwe resultaten met gegevens in de tabel zal de PK-beperking schenden). Als je de tabel echt nodig hebt, gebruik dan SELECT ... INTO general FROM ...
in de bovenstaande zoekopdracht.