Requete SQL

Résolu
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
- Modifié le 1 févr. 2021 à 12:26
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
- 12 mars 2021 à 20:15
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

NHenry
Messages postés
14943
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 juillet 2022
161
2 févr. 2021 à 20:05
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 ....

0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

4 févr. 2021 à 19:21
Bonjour,

Je vous remercie pour votre début de réponse. Je me replongerai dans le problème ce week-end.

CB
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

15 févr. 2021 à 00:05
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
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
> hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

20 févr. 2021 à 12:00
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
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
> hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

27 févr. 2021 à 09:17
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
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
> hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

6 mars 2021 à 10:02
Bonjour,

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

CB
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022

11 mars 2021 à 20:02
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
0
NHenry
Messages postés
14943
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 juillet 2022
161
11 mars 2021 à 21:31
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.
0
hoquei44
Messages postés
14764
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
2 juillet 2022
> NHenry
Messages postés
14943
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 juillet 2022

12 mars 2021 à 20:15
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
0