|
|
-- ? 1 - Écrire une fonction qui pour un match donné calcule le nombre de rebonds
|
|
|
-- ? pris par les joueurs qui n’ont pas débuté la rencontre. Proposez deux versions,
|
|
|
-- ? une utilisant les fonctions d’agrégation et une autre utilisant un curseur mais aucune fonction d’agrégation.
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION calcul_rebonds(match Game.id%TYPE) RETURNS integer AS $$
|
|
|
DECLARE
|
|
|
sumRebounds integer;
|
|
|
BEGIN
|
|
|
SELECT sum(gd.rebounds) INTO sumRebounds
|
|
|
FROM GameDetail gd, Game g
|
|
|
WHERE g.id = match AND gd.idGame = g.id AND gd.startPosition is NULL;
|
|
|
|
|
|
RETURN sumRebounds;
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
SELECT calcul_rebonds('22100979');
|
|
|
|
|
|
-- CREATE FUNCTION
|
|
|
-- calcul_rebonds
|
|
|
-- ----------------
|
|
|
-- 32
|
|
|
-- (1 row)
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION calcul_rebonds_curs(match Game.id%TYPE) RETURNS GameDetail.rebounds%TYPE AS $$
|
|
|
DECLARE
|
|
|
sumRebounds GameDetail.rebounds%TYPE := 0;
|
|
|
rbs GameDetail.rebounds%TYPE := 0;
|
|
|
curs cursor FOR SELECT rebounds
|
|
|
FROM GameDetail
|
|
|
WHERE idGame = match AND startPosition is NULL AND rebounds is NOT NULL;
|
|
|
BEGIN
|
|
|
OPEN curs;
|
|
|
FETCH curs INTO rbs;
|
|
|
|
|
|
WHILE FOUND LOOP
|
|
|
sumRebounds = sumRebounds + rbs;
|
|
|
FETCH curs INTO rbs;
|
|
|
END LOOP;
|
|
|
|
|
|
CLOSE curs;
|
|
|
|
|
|
RETURN sumRebounds;
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
SELECT calcul_rebonds_curs('22100979');
|
|
|
|
|
|
-- CREATE FUNCTION
|
|
|
-- calcul_rebonds_curs
|
|
|
-- ---------------------
|
|
|
-- 32
|
|
|
-- (1 row)
|
|
|
|
|
|
|
|
|
|
|
|
-- ? 2 - Vérifier que vos deux versions retournent les mêmes résultats en affichant le nombre total de rebonds
|
|
|
-- ? pris par les joueurs n’ayant pas débuté la rencontre pour tous les matchs ayant eu lieu le 12 mars 2022.
|
|
|
|
|
|
SELECT calcul_rebonds(id)
|
|
|
FROM Game
|
|
|
WHERE dateGame = '2022-03-12';
|
|
|
|
|
|
-- calcul_rebonds
|
|
|
-- ----------------
|
|
|
-- 39
|
|
|
-- 20
|
|
|
-- 43
|
|
|
-- 40
|
|
|
-- 41
|
|
|
-- 25
|
|
|
-- 24
|
|
|
-- (7 rows)
|
|
|
|
|
|
SELECT calcul_rebonds_curs(id)
|
|
|
FROM Game
|
|
|
WHERE dateGame = '2022-03-12';
|
|
|
|
|
|
-- calcul_rebonds_curs
|
|
|
-- ---------------------
|
|
|
-- 39
|
|
|
-- 20
|
|
|
-- 43
|
|
|
-- 40
|
|
|
-- 41
|
|
|
-- 25
|
|
|
-- 24
|
|
|
-- (7 rows)
|
|
|
|
|
|
|
|
|
-- ? 3 - Écrire une fonction qui calcule la même chose mais pour les joueurs ayant débuté la rencontre,
|
|
|
-- ? autrement dit qui calcule, pour un match donné, le nombre de rebonds pris par les joueurs ayant débuté la rencontre.
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION calcul_rebonds_t(match Game.id%TYPE) RETURNS integer AS $$
|
|
|
DECLARE
|
|
|
sumRebounds integer;
|
|
|
BEGIN
|
|
|
SELECT sum(gd.rebounds) INTO sumRebounds
|
|
|
FROM GameDetail gd, Game g
|
|
|
WHERE g.id = match AND gd.idGame = g.id AND gd.startPosition is NOT NULL;
|
|
|
|
|
|
IF sumRebounds is NULL THEN
|
|
|
RETURN 0;
|
|
|
END IF;
|
|
|
|
|
|
RETURN sumRebounds;
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
SELECT calcul_rebonds_t('22100979');
|
|
|
|
|
|
-- CREATE FUNCTION
|
|
|
-- calcul_rebonds_t
|
|
|
-- ------------------
|
|
|
-- 57
|
|
|
-- (1 row)
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION calcul_rebonds_curs_t(match Game.id%TYPE) RETURNS GameDetail.rebounds%TYPE AS $$
|
|
|
DECLARE
|
|
|
sumRebounds GameDetail.rebounds%TYPE := 0;
|
|
|
rbs GameDetail.rebounds%TYPE := 0;
|
|
|
curs cursor FOR SELECT rebounds
|
|
|
FROM GameDetail
|
|
|
WHERE idGame = match AND startPosition is NOT NULL AND rebounds is NOT NULL;
|
|
|
BEGIN
|
|
|
OPEN curs;
|
|
|
FETCH curs INTO rbs;
|
|
|
|
|
|
WHILE FOUND LOOP
|
|
|
sumRebounds = sumRebounds + rbs;
|
|
|
FETCH curs INTO rbs;
|
|
|
END LOOP;
|
|
|
|
|
|
CLOSE curs;
|
|
|
|
|
|
RETURN sumRebounds;
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
SELECT calcul_rebonds_curs_t('22100979');
|
|
|
|
|
|
-- CREATE FUNCTION
|
|
|
-- calcul_rebonds_curs_t
|
|
|
-- -----------------------
|
|
|
-- 57
|
|
|
-- (1 row)
|
|
|
|
|
|
SELECT calcul_rebonds_t('10300004');
|
|
|
SELECT calcul_rebonds_curs_t('10300004');
|
|
|
|
|
|
|
|
|
-- ? 4 - Trouver le match (abréviation des équipes et date) pendant lequel les joueurs
|
|
|
-- ? ayant débuté la rencontre ont réalisé le plus de rebonds.
|
|
|
|
|
|
SELECT t1.abbreviation, t2.abbreviation, g.dateGame, calcul_rebonds_t(g.id)
|
|
|
FROM Game g, Team t1, Team t2
|
|
|
WHERE g.idHomeTeam = t1.id AND g.idVisitorTeam = t2.id AND calcul_rebonds_t(g.id) = (SELECT max(calcul_rebonds_t(id))
|
|
|
FROM Game);
|
|
|
|
|
|
-- abbreviation | abbreviation | dategame | calcul_rebonds_t
|
|
|
-- --------------+--------------+------------+------------------
|
|
|
-- POR | DEN | 2019-05-03 | 101
|
|
|
-- (1 row)
|
|
|
|
|
|
|
|
|
-- ? 5 - Y a t’il des matchs pour lesquels les données sur les rebonds sont incohérentes?
|
|
|
-- ? Vérifier en comparant les valeurs obtenus grâce aux fonctions précédentes avec les valeurs contenues dans la table Game.
|
|
|
|
|
|
-- ! SELECT t1.abbreviation, t2.abbreviation, g.dateGame, (calcul_rebonds_t(g.id) + calcul_rebonds(g.id)) as fct, g.reboundsHome, g.reboundsAway
|
|
|
-- ! FROM Game g, Team t1, Team t2
|
|
|
-- ! WHERE g.idHomeTeam = t1.id AND g.idVisitorTeam = t2.id AND calcul_rebonds_t(g.id) = (SELECT max(calcul_rebonds_t(id))
|
|
|
-- ! FROM Game); |