-- 1. Discipline proposant plus d’épreuves en juillet qu’en août.
SELECT d.nom discipline FROM epreuve e
INNER JOIN discipline d ON d.code = e.discipl
WHERE EXTRACT(MONTH FROM e.dateE) = 7
GROUP BY d.code
HAVING COUNT(*) >= (
	SELECT COUNT(*) FROM epreuve
	WHERE discipl = d.code AND EXTRACT(MONTH FROM dateE) = 8
);
/*
      discipline       
-----------------------
 Archery
 3x3 Basketball
 Cycling BMX Racing
 Baseball/Softball
 Cycling Road
 Canoe Slalom
 Diving
 Fencing
 Trampoline Gymnastics
 Judo
 Cycling Mountain Bike
 Rowing
 Rugby Sevens
 Shooting
 Skateboarding
 Surfing
 Swimming
 Tennis
 Taekwondo
 Triathlon
 Table Tennis
 Weightlifting
(22 lignes)
*/

-- 2. Pays dont au moins la moitié des athlètes ont obtenu une médaille.
SELECT p.nom nom_pays,
	COUNT(*) athletes,
	COUNT(DISTINCT r.athlete) athletes_medailles
FROM athlete
INNER JOIN pays p ON athlete.pays = p.code
LEFT JOIN resultat r on athlete.code = r.athlete
GROUP BY p.code
HAVING COUNT(DISTINCT r.athlete) >= COUNT(*) FILTER (WHERE r.athlete IS NULL);
/*
  nom_pays  | athletes | athletes_medailles 
------------+----------+--------------------
 Bermuda    |        2 |                  1
 Fiji       |       32 |                 26
 San Marino |        6 |                  3
(3 lignes)
*/

-- 3. Pays ayant remporté plus de médailles d’or que de médailles d’argent et de bronze cumulées.
SELECT pays,
    COUNT(r.medaille) FILTER (WHERE r.medaille = 1) medailles_or,
    COUNT(r.medaille) FILTER (WHERE r.medaille != 1) autres_medailles
FROM resultat r
INNER JOIN athlete a on a.code = r.athlete
GROUP BY pays
HAVING COUNT(r.medaille) FILTER (WHERE r.medaille = 1) >=
    COUNT(r.medaille) FILTER (WHERE r.medaille != 1);
/*
 pays | medailles_or | autres_medailles 
------+--------------+------------------
 CUB  |            8 |                8
 KOS  |            2 |                0
 EST  |            4 |                1
 BEL  |           20 |                6
 SLO  |            3 |                2
 TUN  |            1 |                1
 BER  |            1 |                0
 LAT  |            4 |                1
 THA  |            1 |                1
 FIJ  |           13 |               13
 BUL  |            7 |                3
 PUR  |            1 |                0
 MAR  |            1 |                0
 UGA  |            2 |                2
 BRA  |           29 |               26
 ECU  |            2 |                1
 BAH  |            2 |                0
 JPN  |           68 |               63
 QAT  |            2 |                2
 UZB  |            3 |                2
(20 lignes)
*/

-- 4. Nom et prénom des athlètes féminines plus grandes que tous leurs compatriotes masculins.
SELECT nom, prenom FROM athlete a
WHERE sexe = 'F'
	AND taille IS NOT NULL
	AND taille >= ALL (
		SELECT taille FROM athlete
		WHERE pays = a.pays AND sexe = 'M' AND taille IS NOT NULL
	);

/*
          nom          |        prenom        
-----------------------+----------------------
 ABDUL HADI            | Farah Ann
 AL-KAABI              | Fatimah Abbas Waheeb
 ALVARADO              | Luciana
 ALVES LOPES           | Marcia
 AYIVON                | Claire
 BABOVIC               | Anastasija
 BALADIN               | Hande
 BANDA                 | Babra
 BAYASGALAN            | Solongo
 BELEMU                | Margaret
 BENITEZ               | Jackie
 BOZ                   | Meryem
 BRNOVIC               | Tatjana
 BYLON                 | Atheyna
[...]
(86 lignes)
*/

-- 5. Lister chaque athlète masculin français (nom, prénom, taille) et comparer leur taille avec celle du plus grand d’entre eux.
SELECT nom, prenom, taille, taille - (
	SELECT MAX(taille) FROM athlete
	WHERE sexe = 'M' AND pays = 'FRA'
) diff FROM athlete
WHERE sexe = 'M' AND pays = 'FRA';
/*
       nom        |     prenom      | taille | diff
------------------+-----------------+--------+-------
 ABALO            | Luc             |   1.83 | -0.35
 AIT SAID         | Samir           |   1.68 | -0.50
 ALBICY           | Andrew          |   1.78 | -0.40
 ALIEV            | Mourad          |        |
 AMDOUNI          | Morhad          |        |
 AMOROS           | Emile           |   1.78 | -0.40
 ANDRE            | Sylvain         |        |
 ANDRODIAS        | Matthieu        |   1.94 | -0.24
[...]
(220 lignes)
*/

-- 6. Pour chaque épreuve, indiquer sa date et les dates des premières et dernières épreuves de la discipline.
SELECT *,
	(SELECT MIN(dateE) FROM epreuve WHERE discipl = e.discipl) datemin,
	(SELECT MAX(dateE) FROM epreuve WHERE discipl = e.discipl) datemax
FROM epreuve e;
/*
 code | discipl |                     nom                      |   datee    |  datemin   |  datemax
------+---------+----------------------------------------------+------------+------------+------------
 E001 | ARC     | Mixed Team                                   | 2021-07-24 | 2021-07-24 | 2021-07-31
 E002 | CRD     | Men's Road Race                              | 2021-07-24 | 2021-07-24 | 2021-07-28
 E003 | FEN     | Men's Sabre Individual                       | 2021-07-24 | 2021-07-24 | 2021-08-01
 E004 | FEN     | Women's Epée Individual                      | 2021-07-24 | 2021-07-24 | 2021-08-01
 E005 | JUD     | Men -60 kg                                   | 2021-07-24 | 2021-07-24 | 2021-07-31
 E006 | JUD     | Women -48 kg                                 | 2021-07-24 | 2021-07-24 | 2021-07-31
 E007 | SHO     | 10m Air Pistol Men                           | 2021-07-24 | 2021-07-24 | 2021-08-02
[...]
(355 lignes)
*/

-- 7. Un typhon est annoncé. Les épreuves de la dernière journée doivent être reportée d’une semaine. Quelle commande permet de faire cette modification sans connaître la date de la dernière journée ?
UPDATE epreuve
SET dateE = dateE + 7
WHERE dateE = (
	SELECT MAX(dateE) FROM epreuve
);
/*
UPDATE 13
*/

-- 8. Suspicion de dopage dans les épreuves d’haltérophilie (Weightlifting). Supprimer tous les résultats aux épreuves d’haltérophilie pour le pays ayant remporté le plus de médailles dans cette discipline.
DELETE FROM resultat r
USING epreuve e
WHERE e.code = r.epreuve AND e.discipl = (
	SELECT code FROM discipline WHERE nom = 'Weightlifting'
) AND r.athlete IN (
	SELECT code FROM athlete WHERE pays IN (
		SELECT a.pays FROM resultat r
		INNER JOIN epreuve e ON e.code = r.epreuve
		INNER JOIN athlete a ON a.code = r.athlete
		WHERE e.discipl = (
			SELECT code FROM discipline WHERE nom = 'Weightlifting'
		)
		GROUP BY a.pays
		ORDER BY COUNT(*) DESC
		LIMIT 1
	)
);
/*
DELETE 8
*/

-- 9. Ajouter une nouvelle épreuve :’Women’’s team’ pour le golf ayant lieu le 09/08/2021 (code de l’épreuve :’E356’).
INSERT INTO epreuve VALUES(
	'E356',
	(SELECT code FROM discipline WHERE nom = 'Golf'),
	'Women''s team',
	'2021-08-09'
);
/*
INSERT 0 1
*/

-- 10. Écrire une requête permettant de donner une médaille d’or lors de l’épreuve crée à la question précédente à toutes les golfeuses des Etats-unis.
INSERT INTO resultat
SELECT 'E356', a.code, (SELECT place FROM medaille WHERE couleur = 'Or')
FROM athlete a
INNER JOIN pratiquer p ON p.athlete = a.code
WHERE a.pays = (SELECT code FROM pays WHERE nom = 'United States of America')
	AND p.discipl = (SELECT code FROM discipline WHERE nom = 'Golf')
	AND a.sexe = 'F';
/*
INSERT 0 4
*/

-- 11. Même question mais pour donner une médaille d’argent à toutes les golfeuses sud-coréennes.
INSERT INTO resultat
SELECT 'E356', a.code, (SELECT place FROM medaille WHERE couleur = 'Argent')
FROM athlete a
INNER JOIN pratiquer p ON p.athlete = a.code
WHERE a.pays = (SELECT code FROM pays WHERE nom = 'Republic of Korea')
	AND p.discipl = (SELECT code FROM discipline WHERE nom = 'Golf')
	AND a.sexe = 'F';
/*
INSERT 0 4
*/

-- 12. Vérifier que vos deux requêtes précédentes ont bien fonctionnées en affichant les résultats de l’épreuve 'E356' (y compris nom, prénom et pays des médaillées).
SELECT p.nom pays, a.sexe, a.nom, a.prenom, m.couleur FROM resultat r
INNER JOIN medaille m ON m.place = r.medaille
INNER JOIN athlete a ON a.code = r.athlete
INNER JOIN pays p ON p.code = a.pays
WHERE r.epreuve = 'E356'
ORDER BY r.medaille;
/*
           pays           | sexe |   nom    |  prenom   | couleur 
--------------------------+------+----------+-----------+---------
 United States of America | F    | THOMPSON | Lexi      | Or
 United States of America | F    | KORDA    | Jessica   | Or
 United States of America | F    | KORDA    | Nelly     | Or
 United States of America | F    | KANG     | Danielle  | Or
 Republic of Korea        | F    | PARK     | Inbee     | Argent
 Republic of Korea        | F    | KIM      | Hyojoo    | Argent
 Republic of Korea        | F    | KIM      | Sei Young | Argent
 Republic of Korea        | F    | KO       | Jin Young | Argent
(8 lignes)
*/

-- 13. Réinitialiser votre base de données avec le script jo.sql pour annuler les modifications faites sur ces deux dernières questions.
\i jo.sql
