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

Ferbak Messages postés 7 Statut Membre -  
yg_be Messages postés 23437 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

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. Ferbak Messages postés 7 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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. Ferbak Messages postés 7 Statut Membre
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ferbak Messages postés 7 Statut Membre
         
        peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?
        0