Requête paramétrée sur une table avec une jointure sur cette même table

Fermé
Ferbak Messages postés 6 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 18 décembre 2018 - 14 déc. 2018 à 18:21
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 19 déc. 2018 à 16:58
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

2 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
Modifié le 14 déc. 2018 à 18:35
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?
0
Ferbak Messages postés 6 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 18 décembre 2018
14 déc. 2018 à 21:23
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
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
Modifié le 15 déc. 2018 à 11:13
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:
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 
0
Ferbak Messages postés 6 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 18 décembre 2018
18 déc. 2018 à 23:55
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
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > Ferbak Messages postés 6 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 18 décembre 2018
19 déc. 2018 à 16:58
peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?
0