-- ? 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);