Du kan løse dette problem i ren SQL, du behøver ikke en funktion til dette.
Det bedste er at dele indsamlingen af statistikker op i to forskellige spørgsmål, en for hvornår holdet spiller hjemme, en når de spiller ude. For hvert spil udregn pointene og de scorede mål. Derefter UNION
disse to forespørgsler og brug det som en underforespørgsel til at beregne den overordnede statistik:
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;
Dette er ikke specielt hurtigt på grund af CASE
sætninger, men det vil være hurtigere end at bruge en procedure og en loop.
I stedet for at indsætte resultatet af denne forespørgsel i en tabel, vil jeg foreslå, at du CREATE VIEW general AS ...
med ovenstående forespørgsel. I så fald får du altid de seneste resultater, når du SELECT * FROM general
og du behøver ikke TRUNCATE
den generelle tabel, før du kører forespørgslen (tilføjelse af nye resultater med data i tabellen vil overtræde PK-begrænsningen). Hvis du virkelig har brug for tabellen, så brug SELECT ... INTO general FROM ...
i forespørgslen ovenfor.