Requête paramétrée sur une table avec une jointure sur cette même table
Ferbak
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
Je coince sur une requête. Je parviens à mon résultat, mais avec une méthode vraiment pas optimale je pense.
En résumé, j'ai trois tables concernées par cette requête:
Personnel
Id_Prest
NN_Perso_Prest
Fk_Perso
Fk_Prest
Prestation
Id_Perso
Une ou plusieurs personnes peuvent donc participer à une ou plusieurs prestations.
Pour une personne donnée, je voudrais pouvoir afficher toutes les prestations auxquelles elle participe, avec toutes une série d''autres infos. Jusque là, aucun souci...
Dans cette requête, je voudrais une colonne supplémentaire avec la somme des personnes liées aux différentes prestations trouvées. Autrement dit, je voudrais avoir une sous requête qui me donne donne, pour chaque Prestation trouvée auxquelles participe la personne, la somme des enregistrements liés dans la table NN_Perso_Prest (toute personne confondue).
Je ne parviens pas à faire cela simplement.
Voici un mini exemple illustré avec le résultat attendu :
Personnel
Id_Perso
1
2
3
Prestation
Id_Prest
1
2
3
NN_Perso_Prest
FK_Perso - Fk_Prest
1-2
2-2
1-1
1-3
3-3
2-2
Paramètre : Perso = 1
Résultat :
Prest - Nb_participants
2-3
1-1
3-2
En espérant avoir été clair.
D'avance un tout grand merci à ceux qui pourraient m'éclairer.
Bonne soirée,
Ferbak
Je coince sur une requête. Je parviens à mon résultat, mais avec une méthode vraiment pas optimale je pense.
En résumé, j'ai trois tables concernées par cette requête:
Personnel
Id_Prest
NN_Perso_Prest
Fk_Perso
Fk_Prest
Prestation
Id_Perso
Une ou plusieurs personnes peuvent donc participer à une ou plusieurs prestations.
Pour une personne donnée, je voudrais pouvoir afficher toutes les prestations auxquelles elle participe, avec toutes une série d''autres infos. Jusque là, aucun souci...
Dans cette requête, je voudrais une colonne supplémentaire avec la somme des personnes liées aux différentes prestations trouvées. Autrement dit, je voudrais avoir une sous requête qui me donne donne, pour chaque Prestation trouvée auxquelles participe la personne, la somme des enregistrements liés dans la table NN_Perso_Prest (toute personne confondue).
Je ne parviens pas à faire cela simplement.
Voici un mini exemple illustré avec le résultat attendu :
Personnel
Id_Perso
1
2
3
Prestation
Id_Prest
1
2
3
NN_Perso_Prest
FK_Perso - Fk_Prest
1-2
2-2
1-1
1-3
3-3
2-2
Paramètre : Perso = 1
Résultat :
Prest - Nb_participants
2-3
1-1
3-2
En espérant avoir été clair.
D'avance un tout grand merci à ceux qui pourraient m'éclairer.
Bonne soirée,
Ferbak
A voir également:
- Requête paramétrée sur une table avec une jointure sur cette même table
- Table ascii - Guide
- Table des matières word - Guide
- Table des caractères - Guide
- Tableau croisé dynamique ou table de pilote - Guide
- Table des annexes word - Forum Word
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, peux-tu partager tes deux requêtes: celle à laquelle tu voudrais ajouter une colonne, et celle que tu utilises, qui te donne le bon résultat, et que tu souhaites optimiser?
Bonsoir,
Merci pour ta réponse.
Voici donc ma première requête, un peu plus complète que mon exemple simplifié :
SELECT
Personnel.ID_Personnel AS ID_Personnel,
Personnel.Nom AS Nom,
NN_Prest_Perso.FK_Personnel AS FK_Personnel,
Prestations.ID_Prestations AS ID_Prestations,
Prestations.Dateprest AS Dateprest,
Programmation.ID_Programmation AS ID_Programmation,
Sites.ID_Sites AS ID_Sites,
Clients.ID_Clients AS ID_Clients
FROM
Personnel,
NN_Prest_Perso,
Prestations,
Programmation,
Sites,
Clients
WHERE
Clients.ID_Clients = Sites.FK_Clients
AND Sites.ID_Sites = Programmation.FK_Sites
AND Programmation.ID_Programmation = Prestations.FK_Programmation
AND Prestations.ID_Prestations = NN_Prest_Perso.FK_Prestations
AND Personnel.ID_Personnel = NN_Prest_Perso.FK_Personnel
AND
(
NN_Prest_Perso.FK_Personnel = {Param_FK_Personnel}
AND Prestations.Dateprest BETWEEN {Param_Dateprest_deb} AND {Param_Dateprest_fin}
)
Et ma seconde requête, dans l'exemple elle porte sur l'ensemble des Prestations, mais je voudrais qu'elle ne porte que sur les Prestations trouvées dans ma première requête.
SELECT
Prestations.ID_Prestations AS ID_Prestations,
COUNT(NN_Prest_Perso.FK_Prestations) AS Comptage
FROM
Prestations,
NN_Prest_Perso
WHERE
Prestations.ID_Prestations = NN_Prest_Perso.FK_Prestations
GROUP BY
Prestations.ID_Prestations
Merci :)
Ferbak
Merci pour ta réponse.
Voici donc ma première requête, un peu plus complète que mon exemple simplifié :
SELECT
Personnel.ID_Personnel AS ID_Personnel,
Personnel.Nom AS Nom,
NN_Prest_Perso.FK_Personnel AS FK_Personnel,
Prestations.ID_Prestations AS ID_Prestations,
Prestations.Dateprest AS Dateprest,
Programmation.ID_Programmation AS ID_Programmation,
Sites.ID_Sites AS ID_Sites,
Clients.ID_Clients AS ID_Clients
FROM
Personnel,
NN_Prest_Perso,
Prestations,
Programmation,
Sites,
Clients
WHERE
Clients.ID_Clients = Sites.FK_Clients
AND Sites.ID_Sites = Programmation.FK_Sites
AND Programmation.ID_Programmation = Prestations.FK_Programmation
AND Prestations.ID_Prestations = NN_Prest_Perso.FK_Prestations
AND Personnel.ID_Personnel = NN_Prest_Perso.FK_Personnel
AND
(
NN_Prest_Perso.FK_Personnel = {Param_FK_Personnel}
AND Prestations.Dateprest BETWEEN {Param_Dateprest_deb} AND {Param_Dateprest_fin}
)
Et ma seconde requête, dans l'exemple elle porte sur l'ensemble des Prestations, mais je voudrais qu'elle ne porte que sur les Prestations trouvées dans ma première requête.
SELECT
Prestations.ID_Prestations AS ID_Prestations,
COUNT(NN_Prest_Perso.FK_Prestations) AS Comptage
FROM
Prestations,
NN_Prest_Perso
WHERE
Prestations.ID_Prestations = NN_Prest_Perso.FK_Prestations
GROUP BY
Prestations.ID_Prestations
Merci :)
Ferbak
Tu avais écrit "Je parviens à mon résultat, mais avec une méthode vraiment pas optimale je pense", et je ne vois pas comment tu y parviens.
Suggestion:
Suggestion:
SELECT Personnel.ID_Personnel AS ID_Personnel, Personnel.Nom AS Nom, NN1.FK_Personnel AS FK_Personnel, Prestations.ID_Prestations AS ID_Prestations, Prestations.Dateprest AS Dateprest, Programmation.ID_Programmation AS ID_Programmation, Sites.ID_Sites AS ID_Sites, Clients.ID_Clients AS ID_Clients , COUNT(NN2.FK_Prestations) AS Comptage FROM Personnel, NN_Prest_Perso AS NN1, Prestations, Programmation, Sites, Clients , NN_Prest_Perso as NN2 WHERE Clients.ID_Clients = Sites.FK_Clients AND Sites.ID_Sites = Programmation.FK_Sites AND Programmation.ID_Programmation = Prestations.FK_Programmation AND Prestations.ID_Prestations = NN1.FK_Prestations AND Personnel.ID_Personnel = NN1.FK_Personnel AND ( NN1.FK_Personnel = {Param_FK_Personnel} AND Prestations.Dateprest BETWEEN {Param_Dateprest_deb} AND {Param_Dateprest_fin} ) AND Prestations.ID_Prestations = NN2.FK_Prestations GROUP BY Personnel.ID_Personnel , Personnel.Nom , NN1.FK_Personnel , Prestations.ID_Prestations , Prestations.Dateprest , Programmation.ID_Programmation , Sites.ID_Sites , Clients.ID_Clients
Bonsoir à toi,
De fait, je n'avais pas posté ma requête, elle impliquait plusieurs requêtes en cascade et je savais qu'elle ne servirait pas à grand chose puisque la solution finale n'aurait rien à voir.
Et de fait, ta solution répond parfaitement à ce que j'attendais, un tout tout grand merci! :)
Bonne soirée,
Ferbak
De fait, je n'avais pas posté ma requête, elle impliquait plusieurs requêtes en cascade et je savais qu'elle ne servirait pas à grand chose puisque la solution finale n'aurait rien à voir.
Et de fait, ta solution répond parfaitement à ce que j'attendais, un tout tout grand merci! :)
Bonne soirée,
Ferbak