You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
4.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- 1. Écrire une requête permettant de lister les codes de pays et le nombre de médailles dor quils ont remporté
SELECT a.pays code_pays,
COUNT(DISTINCT r.epreuve) medailles_or
FROM resultat r
INNER JOIN athlete a ON a.code = r.athlete
WHERE r.medaille = (
SELECT place FROM medaille WHERE couleur = 'Or'
)
GROUP BY a.pays;
-- 2. Transformer la requête précédente en vue nommée MedaillesOr.
CREATE VIEW MedaillesOr AS SELECT a.pays code_pays,
COUNT(DISTINCT r.epreuve) medailles_or
FROM resultat r
INNER JOIN athlete a ON a.code = r.athlete
WHERE r.medaille = (
SELECT place FROM medaille WHERE couleur = 'Or'
)
GROUP BY a.pays;
-- 3. Utiliser la vue créée pour trouver le nombre de médailles dor remportées par la France.
SELECT medailles_or FROM MedaillesOr WHERE code_pays = 'FRA';
/*CREATE OR REPLACE FUNCTION create_view_medailles(couleur_medaille medaille.couleur%TYPE) RETURNS void AS $$
BEGIN
-- TODO nom de la vue
CREATE VIEW MedaillesArgent AS SELECT a.pays code_pays,
COUNT(DISTINCT (r.epreuve, r.medaille)) medailles_or
FROM resultat r
INNER JOIN athlete a ON a.code = r.athlete
WHERE r.medaille = (
SELECT place FROM medaille WHERE couleur = couleur_medaille
)
GROUP BY a.pays;
END;
$$ LANGUAGE plpgsql;*/
CREATE VIEW MedaillesArgent AS SELECT a.pays code_pays,
COUNT(DISTINCT r.epreuve) medailles_argent
FROM resultat r
INNER JOIN athlete a ON a.code = r.athlete
WHERE r.medaille = (
SELECT place FROM medaille WHERE couleur = 'Argent'
)
GROUP BY a.pays;
CREATE VIEW MedaillesBronze AS SELECT a.pays code_pays,
COUNT(DISTINCT r.epreuve) medailles_bronze
FROM resultat r
INNER JOIN athlete a ON a.code = r.athlete
WHERE r.medaille = (
SELECT place FROM medaille WHERE couleur = 'Bronze'
)
GROUP BY a.pays;
-- 5. Créer une vue TableauMedailles listant le nombre de médailles dor, dargent, de bronze et le total.
CREATE VIEW TableauMedailles AS
SELECT p.nom pays,
COALESCE(o.medailles_or, 0) medailles_or, COALESCE(a.medailles_argent, 0) medailles_argent, COALESCE(b.medailles_bronze, 0) medailles_bronze,
(o.medailles_or + a.medailles_argent + b.medailles_bronze) total_medailles
FROM pays p
LEFT JOIN MedaillesOr o ON o.code_pays = p.code
LEFT JOIN MedaillesArgent a ON a.code_pays = p.code
LEFT JOIN MedaillesBronze b ON b.code_pays = p.code
WHERE medailles_or IS NOT NULL
OR medailles_argent IS NOT NULL
OR medailles_bronze IS NOT NULL -- Retire les pays qui ont 0 médaille peu importe la couleur
ORDER BY 2 DESC, 3 DESC, 4 DESC;
-- 6. Afficher le tableau des médailles.
SELECT * FROM tableaumedailles;
-- 7. Un organe de presse souhaite faire son propre classement, en ordonnant les pays en fonction ...
SELECT * FROM tableaumedailles ORDER BY total_medailles DESC, pays;
-- 1. Écrire une requête SQL calculant le nombre dathlètes pratiquants par discipline et par pays
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
INNER JOIN athlete a ON a.code = p.athlete
GROUP BY p.discipl, a.pays;
-- 2. Transformer la requête précédente en vue Pratiquants_v1
CREATE VIEW Pratiquants_v1 AS
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
INNER JOIN athlete a ON a.code = p.athlete
GROUP BY p.discipl, a.pays;
-- 3. Même chose pour Pratiquants_v2 mais ce sera une vue matérialisée.
CREATE MATERIALIZED VIEW Pratiquants_v2 AS
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
INNER JOIN athlete a ON a.code = p.athlete
GROUP BY p.discipl, a.pays;
-- 5. Utiliser les vues créées précédemment pour afficher le nombre dathlètes français pratiquant le judo
SELECT athletes francais_judokas FROM Pratiquants_v1
WHERE code_pays = 'FRA' AND code_discipline = 'JUD';
SELECT athletes francais_judokas FROM Pratiquants_v2
WHERE code_pays = 'FRA' AND code_discipline = 'JUD';
/*SELECT * FROM pratiquer p
INNER JOIN athlete a ON a.code = p.athlete
WHERE p.discipl = 'JUD' AND a.pays = 'FRA';*/
-- 6. Teddy RINER ne pratique plus le judo mais le skateboard (code SKB). Faire les modifications nécessaires.
/*DELETE FROM pratiquer WHERE athlete = (
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
) AND discipl = 'JUD';
INSERT INTO pratiquer VALUES (
(
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
),
'SKB'
);*/
UPDATE pratiquer SET discipl = 'SKB' WHERE athlete = (
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
) AND discipl = 'JUD';
-- 7 et 8.
-- Teddy RINNER est toujours référence dans la version 2 comme judoka puisque c'est une vue matérisalisée et qu'il faut la rafraîchir :
REFRESH MATERIALIZED VIEW Pratiquants_v2;