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

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

  1. Contributeur
    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
    1. 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
      1. Contributeur
        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
      2. 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
      3. Contributeur
        @Ferbakpeux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?
        0