Requete SQL [Résolu]

Signaler
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
-
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
-
Bonjour à vous,

Je suis sous Access 2007 - 2010.

J'ai deux tables :
1/ Un table de licence reprenant le numéro du licencié, le club dans lequel il était inscrit ainsi que le début et la fin de la date de validité de cette licence, soit :
Licence [Num_Licence(nombre), Club(texte), Début(date: jj/mm/aaaa), Fin(date: jj/mm/aaaa)]

2/ Une seconde table comprenant le numéro de licence, le sexe, le nom et la date de naissance du licencié, soit :
Licencié [Num_Licence(nombre), Genre(texte), Nom(texte), Naissance(date: jj/mm/aaaa)]

Le Num_Licence sert de clé primaire pour la table Licencié.

Ce que je souhaite obtenir :
Un tableau renvoyant le numéro de licence, le genre, le nom, la date de naissance, le nombre de licence prise dans le club MONCLUB, ainsi que la première année et la dernière année où une licence a été prise dans ce même club.

Pour l'instant, je n'ai réussi qu'à faire le début de la requête :
SELECT DISTINCT Licencié.Num_Licence, Licencié.Genre, Licencié.Nom, Licencié.Naissance
FROM Licencié, Licence
WHERE ((Licencié.Num_Licence)=Licence.Num_Licence) And ((Licence.Club)="MONCLUB")
ORDER BY Licencié.Nom;


Je sollicite donc votre aide pour m'aider à terminer une requête, à savoir que je souhaite rajouter trois colonnes :
1/ nombre de licences prises à MONCLUB ;
2/ année de la 1ère licence prise à MONCLUB
3/ année de la dernière licence prise à MONCLUB.

Si vous avez besoin d'informations complémentaires, n'hésitez pas à me les demander.
Je vous remercie par avance pour votre aide.

CB

A voir également:

2 réponses

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
On évite les caractères acentués dans les noms des tables, des champs, ... car ceux-ci peuvent poser des soucis (notemment en cas de différence d'encodage).

Ensuite utilise un INNER JOIN au lieu de la clause WHERE pour assembler les 2 tables, c'est plus optimisé.
SELECT Table1.Champ, Table2.Champ FROM Table1 INNER JOIN Table2 ON Table1.Identifiant1=Table2.Identifiant2 WHERE ....

Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Bonjour,

Je reviens vers vous, en suivant vos différents conseils, j'arrive à :
SELECT Personne.Num_Licence, Personne.Genre, Personne.Nom, Personne.Naissance
FROM Personne INNER JOIN Licence 
ON Personne.Num_Licence=Licence.Num_Licence
WHERE Licence.Club="MONCLUB"
ORDER BY Personne.Nom;


Alors qu'avec mes lignes du départ, je parvenais à avoir la liste des licenciés de MONCLUB, désormais je possède la liste des licences de MONCLUB. Cela doit probablement faire avancer mon schmilblick, mais cela ne m'a pas éclairer d'avantage sur les trois colonnes que je souhaite rajouter à mon tableau résultat :
1/ compter le nombre de licences prise à MONCLUB pour chaque licencié ayant pris au moins une licence à MONCLUB : count();
2/ pour chaque licencié, renvoyer la plus petite date de licence prise à MONCLUB : min() ;
3/ pour chaque licencié, renvoyer la plus grande date de licence prise à MONCLUB : max() ;

Merci de m'expliquer avec des mots simples, car je ne suis pas du milieu de l'informatique.

CB
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
>
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Bonjour,

Je suis parvenu au résultat voulu, mais en combinant access puis en utilisant excel. Cela n'a rien d'optimal car il faut jongler avec deux logiciels. Avez-vous des pistes pour m'aider à tout faire sur access ?

CB
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
>
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Bonjour,

Je n'ai pas eu le temps de me plonger dans mon problème cette semaine. Je n'ai donc pas pas pu avancer de mon côté.

CB
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
>
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Bonjour,

Je ne désespère pas de trouver un jour la solution.

CB
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155 >
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Désolé pour le délai de réponse, où sont les champs qui t'intéresse ?
Quel est l'agencement de tes table ?
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021

Merci du retour,

Pour les champs qui m'intéresse :
- Personne.Num_Licence
- Personne.Genre
- Personne.Nom
- Personne.Naissance
et trois autres champs calculés :
- nombre de licences prise à Monclub,
- plus petite date d'une licence à Monclub
- plus grande date d'une licence à Monclub

Concernant l'agencement,
Licence [Num_Licence(nombre), Club(texte), Début(date: jj/mm/aaaa), Fin(date: jj/mm/aaaa)]
Personne [Num_Licence(nombre), Genre(texte), Nom(texte), Naissance(date: jj/mm/aaaa)]

Avec Num_Licence en clé primaire.

CB
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021
155
Je pense qu'un requête du genre :
SELECT Personne.Num_Licence, Personne.Genre, Personne.Nom, Personne.Naissance, count(*) AS NbLicenses, MIN(Licence.Début) AS MinDate, MAX(Licence.Fin) AS MaxDate,
FROM Personne INNER JOIN Licence 
ON Personne.Num_Licence=Licence.Num_Licence
WHERE Licence.Club="MONCLUB"
ORDER BY Personne.Nom
GROUP BY Personne.Num_Licence


serait une bonne piste.
Messages postés
13267
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
10 juin 2021
>
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 juin 2021

MERCI !

J'ai fait quelques ajustement :
- suppression de la virgule terminale de la ligne Select
- inversion des lignes order by et group by
- insertion d'un point virgule final
- insertion de tous les champs non calculés dans le group by et non uniquement la clé primaire
- remplacement du "é" de "Début" par "Debut"

Je n'ai pas encore analysé ce que cela donne dans le détail sur ma base de données, par rapport à mon retraitement manuel, mais à première vue, le résultat parait très bien.

Voici donc le résultat que j'obtiens :

SELECT Personne.Num_Licence, Personne.Genre, Personne.Nom, Personne.Naissance, count(*) AS NbLicenses, MIN(Licence.Debut) AS MinDate, MAX(Licence.Fin) AS MaxDate
FROM Personne INNER JOIN Licence 
ON Personne.Num_Licence=Licence.Num_Licence
WHERE Licence.Club="MONCLUB"
GROUP BY Personne.Num_Licence, Personne.Genre, Personne.Nom, Personne.Naissance
ORDER BY Personne.Nom;


Merci de m'avoir débloqué.

CB