Bạn có thể giải quyết vấn đề này bằng SQL thuần túy, bạn không cần hàm cho việc này.
Điều tốt nhất là chia bộ sưu tập thống kê thành hai truy vấn riêng biệt, một truy vấn khi đội chơi trên sân nhà, một khi họ chơi trên sân khách. Đối với mỗi trò chơi tính điểm và số bàn thắng ghi được. Sau đó, UNION
hai truy vấn đó và sử dụng nó như một truy vấn phụ để tính toán thống kê tổng thể:
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;
Điều này đặc biệt không nhanh do CASE
nhưng sẽ nhanh hơn so với việc sử dụng một thủ tục và một vòng lặp.
Thay vì đặt kết quả của truy vấn này vào một bảng, tôi khuyên bạn nên CREATE VIEW general AS ...
với truy vấn trên. Trong trường hợp đó, bạn luôn nhận được kết quả mới nhất khi bạn SELECT * FROM general
và bạn không cần phải TRUNCATE
bảng tổng quát trước khi chạy truy vấn (thêm kết quả mới với dữ liệu trong bảng sẽ vi phạm ràng buộc PK). Nếu bạn thực sự cần bảng, hãy sử dụng SELECT ... INTO general FROM ...
trong truy vấn ở trên.