IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requetes complexe !


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut Requetes complexe !
    Bonsoir

    je vous expose mon problème qui est pour moi difficile à résoudre, tous d'abord voici mes tables :

    voici pour la tablepersonnels :
    id_pers (int, auto incrémenté)
    pers_nom (varchar)
    pers_prenom (varchar)
    pers_grade (pointe sur l'id de la table grade)
    pers_matricule (varchar)
    pers_centre (pointe sur l'id de la table centre)

    voici ma table manœuvres qui recense les manœuvres que le personnel peut faire :
    id_fma (int, auto incrémenté)
    fma_libelle (varchar)

    et enfin ma table pointage qui recense les manœuvres que le personnel à fait à une date précisé :
    id_pointer (int, auto incrémenté)
    pointer_sp (pointer sur l'id de la table personnels)
    pointer_fma (pointe sur l'id de la table manœuvre)
    pointer_date (date de la réalisation)

    et j'ai crée une requête pour afficher le nombre de manœuvres réalisés pour chaque personne que voici, et qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT CONCAT(personnels.pers_nom,' ', personnels.pers_prenom,' ',grade.grd_grade) AS Nom, COUNT( DISTINCT pointage.pointer_fma ) AS nbreValide
    FROM pointage
    INNER JOIN personnels ON pointage.pointer_sp = personnels.id_pers
    INNER JOIN grade ON personnels.pers_grade = grade.id_grade
    INNER JOIN manoeuvres ON pointage.pointer_fma = manoeuvres.id_fma
    WHERE pointage.pointer_sp
    IN (SELECT personnels.id_pers FROM personnels)
    GROUP BY pointage.pointer_sp
    et maintenant je cherche désespérément une requête me permettant d'afficher pour chaque personne le nombres de manœuvres non réalisé (non présente dans la table pointage):

    j'ai essayé ceci mais elle ne me retourne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT CONCAT(personnels.pers_nom,' ', personnels.pers_prenom,' ',grade.grd_grade) AS Nom, 
    (SELECT count( * )FROM personnels) - count( DISTINCT pointage.pointer_sp ) AS cnt
    FROM pointage
    INNER JOIN personnels ON pointage.pointer_sp = personnels.id_pers
    INNER JOIN grade ON personnels.pers_grade = grade.id_grade
    INNER JOIN manoeuvres ON pointage.pointer_fma = manoeuvres.id_fma
    WHERE pointage.pointer_sp
    IN (SELECT personnels.id_pers FROM personnels)
    GROUP BY pointage.pointer_sp
    Si vous auriez une piste je suis preneur !
    d'avance merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Qu'est ce que ça donne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CONCAT(p.pers_nom,' ', p.pers_prenom,' ',g.grd_grade) AS Nom, 
           m.nb_manoeuvre - count(distinct po.pointer_fma) as nb_manoeuvres_jamais_faites
      FROM personnels p
      JOIN grade g     ON g.id_grade = p.pers_grade
      join pointage po ON po.pointer_sp = p.id_pers
     cross join (select count(*) as nb_manoeuvre from manoeuvres) m
     GROUP BY CONCAT(p.pers_nom,' ', p.pers_prenom,' ',g.grd_grade), m.nb_manoeuvre
    Par contre je ne vois pas à quoi sert la clause WHERE avec le IN, car c'est déjà fait par le ON de la jointure

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Ça fonctionne reste un dernier petit soucis,
    si j'ai une personne dans ma table personnel qui n'a jamais pointer, elle n’apparaitra pas dans la requête ! il faut quelle ai pointer une manœuvre pour apparaitre dans la requête ci dessus !

    je pense que le problème viens du CROSS JOIN, j'ai essayé INNER JOIN mais rien de changé !!!

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    transformer la jointure interne sur la table pointage en jointure externe

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CONCAT(p.pers_nom,' ', p.pers_prenom,' ',g.grd_grade) AS Nom, 
           m.nb_manoeuvre - count(DISTINCT po.pointer_fma) AS nb_manoeuvres_jamais_faites
      FROM personnels p
      JOIN grade g     ON g.id_grade = p.pers_grade
      LEFT JOIN pointage po ON po.pointer_sp = p.id_pers
     CROSS JOIN (SELECT count(*) AS nb_manoeuvre FROM manoeuvres) m
     GROUP BY CONCAT(p.pers_nom,' ', p.pers_prenom,' ',g.grd_grade), m.nb_manoeuvre
    Formidable merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide requete complexe
    Par Sabine78 dans le forum Access
    Réponses: 9
    Dernier message: 18/04/2006, 21h28
  2. requete complexe
    Par nicohugo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2006, 08h10
  3. Requete complexe
    Par d1g-2-d1g dans le forum Langage SQL
    Réponses: 9
    Dernier message: 02/05/2005, 14h47
  4. Requete complexe
    Par Pfeffer dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/02/2005, 17h42
  5. requete complexe
    Par Thunder_nico dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/10/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo