この問題は純粋なSQLで解決できますが、このための関数は必要ありません。
最良の方法は、統計の収集を2つの異なるクエリに分割することです。1つはチームが自宅でプレーするとき、もう1つは離れてプレーするときです。ゲームごとに、得点と得点を計算します。次にUNION
これらの2つのクエリをサブクエリとして使用して、全体的な統計を計算します。
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 ...
を使用してください。 上記のクエリで。