Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 13h35   #1
Invité de passage
 
Inscription : juin 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 14
Points : 1
Points : 1
Par défaut Besoin de votre aide pour une requête

Bonjour,

Je suis débutant sur Access et j'ai besoin d'aide pour réaliser une requête particulière, à savoir :

j'ai une table par exemple "Voyages"

dans cette table 3 champs

"VILLES" - "HOTEL" "NOMBRE DE VISITES"

(avec beaucoup de données dans chaque champ)

Si je veux à travers une requête n'afficher que les 3 "HOTELS" par "VILLE" recevant le plus grand "NOMBRE DE VISITES"

Comment dois-je procéder ?

Merci de votre aide

Bonne journée

BL
leburnet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 18h30   #2
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
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
Code :
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
Code :
SELECT Ville FROM Voyages GROUP BY Ville;
3° pour avoir la plus grande fréquentation de chaque Ville: Req3
Code :
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
Code :
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
Code :
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
Code :
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
Code :
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
Code :
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
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 19h00   #3
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
bonsoir,

si j'ai bien compris, on devrait s'en sortir avec un IN et un SELECT TOP 3:

Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT V.Hotel, V.Ville, V.NbrVisites FROM Voyage V
WHERE V.NbrVisites IN
(
   SELECT TOP 3 U.NbrVisites FROM Voyage U
   WHERE U.Ville=V.Ville
   ORDER BY U.NbrVisites DESC
)
ORDER BY V.Ville, V.NbrVisites
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2011, 09h56   #4
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Merci f-leb
j'avais déjà utilisé IN
mais je ne pensais pas qu'on puisse s'en servir comme d'une fonction.

Petit bémol:
dans mon test, j'ai voulu la baser sur une requête de regroupement sur 250 000 lignes (la Req1)
et là, j'ai cru que mon PC était mort (plus de 5mn avec core i3)
par contre en modfiant ma requête de regroupement en création de table (400 lignes) alors l'exécution est immédiate

Encore merci
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h59.


 
 
 
 
Partenaires

Hébergement Web