Requete SQL

Résolu
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 - Modifié le 1 févr. 2021 à 12:26
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 - 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

2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 > hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 > hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 > hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
6 mars 2021 à 10:02
Bonjour,

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

CB
0
hoquei44 Messages postés 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024
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 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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 16031 Date d'inscription dimanche 19 janvier 2014 Statut Membre Dernière intervention 23 avril 2024 > NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024
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
Rejoignez-nous