Bonjour à tous,
Je n'arrive pas à construire correctement une requête SQL qui n'a pourtant pas l'air bien compliquée...
Voici déjà un aperçu des tables :
Ensuite un jeu d'essais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 CREATE TABLE clubs ( id INTEGER NOT NULL, num INTEGER, nom VARCHAR(100), effectif INTEGER, PRIMARY KEY (id) ) CREATE TABLE manif ( id INTEGER NOT NULL, id_organisateur INTEGER, nom VARCHAR(100), date DATE, route BOOLEAN, vtt BOOLEAN, CP BOOLEAN, PRIMARY KEY (id), FOREIGN KEY(id_organisateur) REFERENCES clubs (id), CHECK (route = 1 OR vtt = 1) ) CREATE TABLE particip ( id_manif INTEGER, id_club INTEGER, nbre INTEGER, type VARCHAR(5) )
Je dois bâtir une requête qui retourne les participants à une manifestation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 INSERT INTO clubs (num, nom, effectif) VALUES (7034, 'Club 1', 5) INSERT INTO clubs (num, nom, effectif) VALUES (1056, 'Club 2', 10) INSERT INTO clubs (num, nom, effectif) VALUES (2021, 'Club 3', 15) INSERT INTO manif (id_organisateur, nom, date, route, vtt, CP) VALUES (1, 'Rando du Port', '2009-06-28', 1, 0, 1) INSERT INTO manif (id_organisateur, nom, date, route, vtt, CP) VALUES (3, 'Une rando quelconque', '2009-06-29', 1, 1, 1) INSERT INTO manif (id_organisateur, nom, date, route, vtt, CP) VALUES (2, 'Une autre rando quelconque', '2009-06-30', 0, 1, 1) INSERT INTO particip (id_manif, id_club, nbre, type) VALUES (2, 1, 5, 'route') INSERT INTO particip (id_manif, id_club, nbre, type) VALUES (2, 2, 5, 'route') INSERT INTO particip (id_manif, id_club, nbre, type) VALUES (2, 2, 5, 'vtt')
Actuellement, je liste les manifs ainsi :
Maintenant, pour _une_ manifestation (définie par son id) j'aimerais avoir la liste des clubs avec leur éventuels participants (en route et vtt). C'est à dire un résultat qui ressemble (certaines colonnes ayant été retirées) à ceci pour la manif 2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT manif.id AS manif_id, manif.id_organisateur AS manif_id_organisateur, manif.nom AS manif_nom, manif.date AS manif_date, manif.route AS manif_route, manif.vtt AS manif_vtt, manif."CP" AS "manif_CP", clubs.id AS clubs_id, clubs.num AS clubs_num, clubs.nom AS clubs_nom, clubs.effectif AS clubs_effectif, particip.id_manif AS particip_id_manif, particip.id_club AS particip_id_club, particip.nbre AS particip_nbre, particip.type AS particip_type, sum(particip.nbre) AS participants FROM manif JOIN clubs ON clubs.id = manif.id_organisateur LEFT OUTER JOIN particip ON particip.id_manif = manif.id WHERE manif.date > '2009-01-01' AND manif.date < '2009-12-31' GROUP BY manif.id ORDER BY clubs.num
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 clubs_id|clubs_effectif|particip_route|particip_vtt 1 | 5 | 5 | 0 2 | 10 | 5 | 5 3 | 15 | 0 | 0
Note : Ces requêtes ne sont pas écrites "à la main", elles sont construites par l'ORM SqlAlchemy (pour SQLite) en Python.
Merci d'avance.
Partager