Можете да разрешите този проблем в чист SQL, не ви трябва функция за това.
Най-доброто нещо е да разделите събирането на статистически данни на две отделни заявки, една за това кога отборът играе у дома и една когато играе като гост. За всяка игра изчислявайте точките и отбелязаните голове. След това UNION
тези две заявки и ги използвайте като подзаявка за изчисляване на общата статистика:
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;
Това не е особено бързо поради CASE
изрази, но ще бъде по-бързо от използването на процедура и цикъл.
Вместо да поставяте резултата от тази заявка в таблица, предлагам ви CREATE VIEW general AS ...
с горното запитване. В този случай винаги получавате най-новите резултати, когато SELECT * FROM general
и не е нужно да TRUNCATE
общата таблица, преди да стартирате заявката (добавянето на нови резултати с данни в таблицата ще наруши PK ограничението). Ако наистина имате нужда от таблицата, използвайте SELECT ... INTO general FROM ...
в заявката по-горе.