Hello
je ne suis pas arrivé en une seule requête
par contre, TOP 3 dans la requête sur une seule ville te donne bien les trois hotels les plus fréquentés
en huit requêtes, ça donne:
1° pour avoir les sommes par ville et par hotel: Req1
SELECT DISTINCT Ville, Hotel, Sum(nbvisit) AS Som_NbVisit FROM Voyages GROUP BY Ville, Hotel;
2° pour avoir une liste avec une seule fois chaque Ville: Req2
SELECT Ville FROM Voyages GROUP BY Ville;
3° pour avoir la plus grande fréquentation de chaque Ville: Req3
SELECT Req2.Ville, Max(Som_NbVisit) AS NbVisit_Hotel1 FROM Req2 INNER JOIN Req1 ON Req2.Ville = Req1.Ville GROUP BY Req2.Ville;
4° pour avoir la deuxième fréquentation inférieure à la première et pour chaque Ville : Req4
1 2 3
| SELECT Req3.Ville, Req3.NbVisit_Hotel1, Req1. Som_NbVisit
FROM Req3 INNER JOIN Req1 ON Req3.Ville = Req1.Ville
WHERE [Req1].[ Som_NbVisit]<[Req3].[ NbVisit_Hotel1]; |
5° pour ne garder que la plus grande des deuxièmes fréquentations : Req5
1 2
| SELECT Req4.Ville, Req4. NbVisit_Hotel1, Max(Som_NbVisit) AS NbVisit_Hotel2 FROM Req4
GROUP BY Req4.Ville, Req4. NbVisit_Hotel1; |
6° pour avoir la troisième fréquentation inférieure à la deuxième et pour chaque Ville : Req6
1 2 3
| SELECT Req5.Ville, Req5. NbVisit_Hotel1, Req5. NbVisit_Hotel2, Req1. Som_NbVisit
FROM Req5 INNER JOIN Req1 ON Req5.Ville = Req1.Ville
WHERE [Req1]. Som_NbVisit]<[Req5].[ NbVisit_Hotel2]; |
7° pour ne garder que la plus grande des troisièmes fréquentations : Req7
1 2 3
| SELECT Req6.Ville, Req6. NbVisit_Hotel1, Req6. NbVisit_Hotel2, Max(Req6. Som_NbVisit) AS NbVisit_Hotel3
FROM Req6
GROUP BY Req6.Ville, Req6. NbVisit_Hotel1, Req6. NbVisit_Hotel2; |
8° et enfin pour attribuer l’hôtel à chacun de ces nombres de visites :Req8
1 2
| SELECT Req7.Ville, Req7. NbVisit_Hotel1, Req1.Hotel AS Hotel1, Req7. NbVisit_Hotel2, Req1_1.Hotel AS Hotel2, Req7. NbVisit_Hotel3, Req1_2.Hotel AS Hotel3
FROM ((Req7 INNER JOIN Req1 ON (Req7. NbVisit_Hotel1 = Req1. Som_NbVisit) AND (Req7.Ville = Req1.Ville)) INNER JOIN Req1 AS Req1_1 ON (Req7. NbVisit_Hotel2 = Req1_1. Som_NbVisit) AND (Req7.Ville = Req1_1.Ville)) INNER JOIN Req1 AS Req1_2 ON (Req7. NbVisit_Hotel3 = Req1_2. Som_NbVisit) AND (Req7.Ville = Req1_2.Ville); |
Comme j'ai fait ça avec des désignations de boulons à la place des vis, des diamètres à la place des hotels et que j'ai transposé le SQL ensuite, il est possible que j'ai laissé trainer des bourdes
En espérant avoir aidé
PS que les pros du SQL améliorent ça et j'en serai ravi
Partager