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 :

Condition sur un COUNT


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    Par défaut Condition sur un COUNT
    Bonjour,

    je vais vous expliquez mon problème assez complexe :

    tous d'abord j'ai une table personnel :

    avec le matricule de la personne, nom, prenom, statut (id d'une autre table) centre (id d'une autre table) et fonction (id d'une autre table)

    ensuite j'ai une table manoeuvres :

    avec l'id de la manoeuvre,
    le n° de module,
    le libelle de la manoeuvre,
    le service,
    etc.... (moins important)

    enfin j'ai ma table pointage qui regroupe les personnes qui on réalise une manoeuvres et la date de réalisation.

    pointer_sp est l'id de la personne pointer
    pointer_fma est l'id de la manoeuvre pour laquelle il est pointer
    et pointer_date correspond à la date du pointage

    j'ai crée une requête qui m'affiche le nom des personnes et le nombres de manoeuvres (distincte) qu'ils ont réalisé avec comme condition :
    que personnel.pers_centre = 5
    et personnel.pers_fonction = 3

    la requête fonctionne mais je souhaite ajouter une autre condition qui ne m'afficherais que les manoeuvres de la table pointage pour la quel le service est égal à "EM Formation" ! je ne sais pas ou placer cette condition ???

    Voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT CONCAT( p.pers_nom,  ' ', p.pers_prenom,  ' ', g.grd_grade ) AS Nom, COUNT( DISTINCT po.pointer_fma ) AS pourcent
    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
    WHERE p.pers_centre =5
    AND p.pers_fonction =3
    GROUP BY CONCAT( p.pers_nom,  ' ', p.pers_prenom,  ' ', g.grd_grade ) , m.nb_manoeuvre
    donc je me demandé si je ne devrais pas rajouter la condition ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     COUNT( DISTINCT po.pointer_fma WHERE manoeuvres.fma_impose = "EM Formation" )
    mais ce n'est pas possible biensur !

    merci d'avance pour votre aide

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Utilise CASE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT( DISTINCT case when manoeuvres.fma_impose = 'EM Formation' then po.pointer_fma end)

  3. #3
    Membre éclairé
    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
    Par défaut
    Lorsque je rajoute case j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1054 - Unknown column 'manoeuvres.fma_impose' in 'field list'

  4. #4
    Membre éclairé
    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
    Par défaut
    Je reviens a mon post car j'ai avancé mai il me reste un dernier problème.

    le principe général est que je souhaite avec ma requête, afficher le nom, prénom et grade des personnes avec le nombre de manoeuvres distincte réalisé dans la table pointage (cf images ci dessus)

    donc voici ma requête qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CONCAT( p.pers_nom, ' ', p.pers_prenom, ' ', g.grd_grade ) AS Nom, count( DISTINCT po.pointer_fma ) AS pourcent
    FROM personnels p
    JOIN grade g ON g.id_grade = p.pers_grade
    LEFT JOIN pointage po ON po.pointer_sp = p.id_pers
    GROUP BY CONCAT( p.pers_nom, ' ', p.pers_prenom, ' ', g.grd_grade )
    ainsi elle m'affiche :
    Pierre Dupont 4
    Jacques malin 2
    Giséle Dufour 0
    Marc pierrot 0
    j'ai donc fait une jointure vers table manoeuvres pour n'afficher que les personnes pour la quelle le champ fma_impose = 'EM Formation'
    Donc voici la requête :
    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, count( DISTINCT po.pointer_fma ) AS pourcent
    FROM personnels p
    JOIN grade g ON g.id_grade = p.pers_grade
    LEFT JOIN pointage po ON po.pointer_sp = p.id_pers
    JOIN manoeuvres ON manoeuvres.id_fma = po.pointer_fma
    WHERE manoeuvres.fma_impose = 'EM Formation'
    GROUP BY CONCAT( p.pers_nom, ' ', p.pers_prenom, ' ', g.grd_grade )
    Mais la le problème c'est que je n'obtient plus les personne qui n'ont effectuer aucune manoeuvres (c'est a dire les personne dont leur id n'est pas présent dans la table pointage) du coup j'obtient :
    Pierre Dupont 4
    Jacques malin 2
    (du coup marc et giséle sont absent alors qu'il ont 0 manoeuvres de pointé) comment résoudre ce soucis ????
    c'est comme si le LEFT JOIN avait disparu !!!

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    La condition de JOIN suivante:
    ON manoeuvres.id_fma = po.pointer_fma
    impose que po.pointer_fma ne soit jamais NULL, et ça contredit le LEFT JOIN qui précède, c.a.d que ça le rend équivalent à un INNER JOIN

    Pour que po.pointer_fma puisse être null, il est impératif de ne pas l'utiliser dans des jointures internes. Généralement pour arriver à ça, on remplace simplement ces jointures internes par des jointures externes (LEFT JOIN ou RIGHT JOIN)

  6. #6
    Membre éclairé
    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
    Par défaut
    oui j'avais essayer avec LEFT JOIN a la place du JOIN ou RIGHT JOIN mais toujours le même résultat je n'ai pas les personne égal à zéro (ce qui ne sont pas dans la table pointage)

    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, count( DISTINCT po.pointer_fma ) AS pourcent
    FROM personnels p
    JOIN grade g ON g.id_grade = p.pers_grade
    LEFT JOIN pointage po ON po.pointer_sp = p.id_pers
    LEFT JOIN manoeuvres ON manoeuvres.id_fma = po.pointer_fma
    WHERE manoeuvres.fma_impose = 'EM Formation'
    GROUP BY CONCAT( p.pers_nom, ' ', p.pers_prenom, ' ', g.grd_grade )

Discussions similaires

  1. Condition sur le count
    Par phy4me dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/05/2009, 18h46
  2. Requetes Avec Count et condition sur date
    Par Harry dans le forum WinDev
    Réponses: 1
    Dernier message: 04/06/2007, 15h23
  3. [MySQL] Faire une condition sur un count()
    Par Him dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 15/05/2007, 19h26
  4. conditions sur 2 COUNT ?
    Par antoines dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/07/2006, 18h22
  5. condition sur count(*) dans mysql
    Par arizona_dream dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/09/2005, 09h06

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