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

Fermé
Signaler
Messages postés
6
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
18 décembre 2018
-
Messages postés
17712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
29 novembre 2021
-
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

Messages postés
17712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
29 novembre 2021
947
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?
Messages postés
6
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
18 décembre 2018

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
Messages postés
17712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
29 novembre 2021
947
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 
Messages postés
6
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
18 décembre 2018

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
Messages postés
17712
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
29 novembre 2021
947 >
Messages postés
6
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
18 décembre 2018

peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?