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 15/05/2011, 15h12   #1
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
Par défaut Aide requête SQL

Bonjour,
J'ai besoin d'aide pour rédiger une requête en SQL sous microsoft access 2010.
Voici mon cahier des charges ainsi que le modèle logique de données.



Je dois traiter la requête suivante : Donner pour chaque agence proposant au minimum 10 hôtels dans la région Midi-Pyrénées, son nom et le nombre d'hôtels précis proposés dans cette même région.

Voici ce que j'ai fait:
Code :
1
2
3
4
5
SELECT nomag, count(*)
FROM hotel, agence, affilier
WHERE hotel.codeh=affilier.codeh AND agence.codeag=affilier.codeag AND régionh="midi-pyrénées"
GROUP BY hotel.codeh, nomag
HAVING count(*)>=10;
Mais cela ne marche pas; il n'y a pas de message d'erreur mais il ne me trouve aucune agence alors que j'en ai créé le nombre suffisant pour que cela puisse marcher.
Merci de m'aider
mar31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 15h46   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
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 411
Points : 4 440
Points : 4 440
bonjour,

Citation:
Donner pour chaque agence proposant au minimum 10 hôtels
il faut donc opérer des regroupements par agence...

Code sql :
GROUP BY hotel.codeh, nomag
... et seulement par agence, tu vois ?

Code sql :
1
2
FROM hotel, agence, affilier
WHERE hotel.codeh=affilier.codeh AND agence.codeag=affilier.codeag
la norme recommande depuis longtemps la syntaxe avec INNER JOIN, mais peut-être que tu ne l'a pas apprise.
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 16h08   #3
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
Ah merci beaucoup effectivement ça marche
Par contre il y a quelque chose que je ne comprends pas très bien : j'ai l'impression que l'on est obligé de regroupé par le champs que l'on veut afficher (le SELECT). Mais là par exemple il n'aurait pas été plus judicieux de regrouper par CodeAg au cas où deux agences aient le même nom?

J'ai d’ailleurs rencontré le même problème pour cette requête : "Donner le nom et la ville des hôtels de la Haute-Garonne (département 31) contenant au minimum 100 chambres."

J'ai donc procédé ainsi:
Code :
1
2
3
4
5
SELECT hotel.nomh, hotel.villeh
FROM hotel, chambre
WHERE hotel.codeh=chambre.codeh AND cpostalh>=31000 AND cpostalh<32000
GROUP BY hotel.codeh, hotel.nomh, hotel.villeh
HAVING count(*)>100;
Cette requête à l'air de marcher; cependant je ne voulais regrouper que par codeh mais access m'a indiqué un message d'erreur et j'ai donc été obligée de rajouté nomh et villeh.

Et effectivement, je n'ai pas encore appris le INNER JOIN

Une dernière petite question si ce n'est pas trop demandé:
Pour la fonction d'agrégat COUNT(), je ne comprend pas bien la différence entre mettre count(*), count(distinct(XX)) ou count avec n'importe quel autre champ puisque le nombre de lignes sera toujours le même quel que soit le champ sélectionné?

Merci de ton aide
mar31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 16h40   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
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 411
Points : 4 440
Points : 4 440
je réponds rapidement, je dois quitter

Citation:
Envoyé par mar31 Voir le message
Par contre il y a qqch que je ne comprends pas très bien : j'ai l'impression que l'on est obligé de regroupé par le champs que l'on veut afficher (le SELECT).
bien vu,

Citation:
Clause GROUP BY
Tous les champs de la liste de champs SELECT doivent être inclus, soit dans la clause GROUP BY, soit dans une fonction d'agrégation SQL, sous forme d'arguments.
Citation:
Envoyé par mar31 Voir le message
Mais là par exemple il n'aurait pas été plus judicieux de regrouper par CodeAg au cas où deux agences aient le même nom
bien vu à nouveau !

Code sql :
1
2
3
4
5
SELECT CodeAg, count(*)
FROM ...
WHERE...
GROUP BY CodeAg
HAVING...
retourne à coup sûr les agences souhaitées, si on veut les noms et villes on peut écrire:

Code sql :
1
2
3
4
5
SELECT CodeAg, NomAg, VilleAg, count(*)
FROM ...
WHERE...
GROUP BY CodeAg, NomAg, VilleAg
HAVING...

car CodeAg-->NomAg et Code Ag-->VilleAg

il faut rajouter codeh dans le select:
Code sql :
1
2
3
4
5
SELECT hotel.codeh, hotel.nomh, hotel.villeh
FROM hotel, chambre
WHERE hotel.codeh=chambre.codeh AND cpostalh>=31000 AND cpostalh<32000
GROUP BY hotel.codeh, hotel.nomh, hotel.villeh
HAVING count(*)>100;


Citation:
Envoyé par mar31 Voir le message
Une dernière petite question si ce n'est pas trop demandé:
Pour la fonction d'agrégat COUNT(), je ne comprend pas bien la différence entre mettre count(*), count(distinct(XX)) ou count avec n'importe quel autre champ puisque le nombre de lignes sera toujours le même quel que soit le champ sélectionné?
Count(distinct(XX)) n'est pas acceptée par Access

A cause d'éventuels champs qui peuvent être à Null,
Citation:

Fonction Count

La fonction Count ne compte pas les enregistrements possédant des champs Null sauf si l’argument expr est remplacé par le caractère générique astérisque (*). Si vous utilisez un astérisque, la fonction Count calcule le nombre total des enregistrements, y compris ceux qui contiennent des champs Null. Count(*) s'exécute beaucoup plus rapidement que Count([nom_de_colonne])...
je reviendrais plus tard au besoin...
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 17h48   #5
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
D'accord, merci bcp pour tes réponses
Mais donc quand tu me dis par exemple qu'il faut rajouter codeh dans les select, access va me retourner le code de l'hotel, or je ne le souhaite pas. Donc comment faire?
P.S.: En fait, je suis à la faculté et ce sujet est une annale, donc si je ne fais pas exactement ce qui est demandé, je n'aurais pas tous les points.
mar31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 19h06   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
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 411
Points : 4 440
Points : 4 440
hop, j'reviens...

pour ce cas d'école, on doit pouvoir tolérer:

Code sql :
1
2
3
4
5
SELECT hotel.nomh, hotel.villeh
FROM ...
WHERE ...
GROUP BY hotel.nomh, hotel.villeh
HAVING ...;

mais le résultat est faussé si tu as deux hôtels qui ont le même nom dans une même ville (peu probable mais...).

Si tu as beaucoup de champs à ramener, par exemple:
Code sql :
1
2
3
4
5
SELECT hotel.nomh, hotel.rueH, hotel.villeh, hotel.CPostalH, hotel.regionH
FROM ...
WHERE ...
GROUP BY  hotel.nomh, hotel.rueH, hotel.villeh, hotel.CPostalH, hotel.regionH
HAVING ...;
où le GROUP BY sur un tas de champs peut être pénalisant sur les performances, il vaut parfois mieux décomposer:

requête R1:
Code sql :
1
2
3
4
SELECT chambre.codeH
FROM chambre
GROUP BY chambre.codeH
HAVING count(*)>100;
puis
Code sql :
1
2
3
SELECT hotel.nomh, hotel.rueH, hotel.villeh, hotel.CPostalH, hotel.regionH
FROM hotel, R1
WHERE hotel.codeH=R1.codeH
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 20h08   #7
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 8
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 8
Points : 1
Points : 1
Ah d'accord je ne savais pas que l'on pouvait faire une requête à partir d'une autre. En tous cas merci beaucoup
mar31 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 11h51.


 
 
 
 
Partenaires

Hébergement Web