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 :

Compter le nombre d'occurences par date et par employé


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut Compter le nombre d'occurences par date et par employé
    Bonsoir à tous,
    Je souhaite compter pour chaque utilisateur, le nombre de lignes par date. Les dates avec 0 lignes inclues.
    J'utilise 3 tables, emplye, tasks et calendar pour les jours travaillés.
    J'ai réussi à l'aide du forum à afficher le nombre de lignes pour les jours pointés mais pas pour les dates figurant sur la table calendar et qui ne figurent pas sur la tables tasks pour chaque employé.
    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    select e.matricule
         , e.nom
         , e.prenom 
         , coalesce(subq.counter, 0)
         , subq.dt
    from employe e
    left join 
         (select c.dt
                , count(t.date) as counter
                , t.matricule
          from calendar c
          left join tasks t 
            on t.date = c.dt
          group by c.dt
              , t.matricule
         )as SUBQ
       on SUBQ.matricule = E.matricule
    Je met un esemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    table employe(id, matricule, name) 
     
           1,101, name1 
           2,202, name2 
           3, 303, name3 
     
           table calendar(id, dt) 
     
           1, 2020-01-01
           2, 2020-01-02 
           3, 2020-01-03 
     
           table tasks(id, task, matricule, date)
     
           1, task1, 101, 2020-01-03 
           2, task3, 101, 2020-01-03 
           3, task2, 202, 2020-01-01 
     
           Le résultat voulu: 
           matricule, date, counter
           101, 2020-01-01, 0 
           101, 2020-01-02, 0 
           101, 2020-01-03, 2 
           202, 2020-01-01, 1 
           202, 2020-01-02, 0 
           202, 2020-01-03, 0 
           303, 2020-01-01, 0 
           303, 2020-01-02, 0 
           303, 2020-01-03, 0
    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 364
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je ne suis pas un expert SQL, donc peu de chance que je trouve une solution ; par contre, pour qu'on puisse t'aider, je pense qu'il serait souhaitable de pouvoir exécuter ton exemple. Pour ne pas obliger les contributeurs à tout recréer, serait-il possible de générer depuis ton gestionnaire SQL (comme PhpMyAdmin ou MySQL Workbench) un export (structure des tables et data) ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    Dans la table dérivée, le GROUP BY est incohérent avec le SELECT.
    Seul MySQL accepte cette syntaxe, tout autre SGBD aurait hurlé.
    Si vous voulez récupérer un numéro de matricule, il faut ajouter une fonction d'agrégation telle que MAX().

    exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    left join 
         (select c.dt
               , count(t.date) as counter
               , max(t.matricule)
          from calendar c
          left join tasks t 
            on t.date = c.dt
          group by c.dt
                 , t.matricule
         ) as SUBQ

    Ce faisant, vous ne récupérerez qu'un employé par date bien entendu !

    Or, je suppose que vous voulez, pour chaque employé et chaque date, savoir le nombre de tâches qu'il a faites, y compris s'il n'en a fait aucune.
    Auquel cas il faut regrouper sur le matricule employé et la date et compter le nombre de taches comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    left join 
         (select c.date,
               , t.matricule
               , count(t.ident) as counter  -- identifiant de la tâche
          from calendar c
          left join tasks t 
            on t.date = c.dt
          group by c.dt
                 , t.matricule
         ) as SUBQ

    et faire la jointure avec la requête principale sur le matricule employé et la date

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Bonjour,

    En fait, il faut multiplier les employés par les dates du calendrier puis calculer pour chacun de couples obtenus le nombre de tâches connues...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    select  emp.matricule
        ,   emp.nom
        ,   emp.prenom 
        ,   count(tsk."date")
        ,   cld.dt
    from    calendar    cld
        cross join
            employe     emp
        left join 
            tasks       tsk 
            on  tsk."date"    = cld.dt
            and tsk.matricule = emp.matricule
    group by cld.dt
        ,   emp.matricule
        ,   emp.nom
        ,   emp.prenom 
    ;
    Attention : date est un mot réservé du langage SQL et ne devrait pas être utilisé comme identifiant d'un objet de la bases de données.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    moi qui passe mon temps à militer contre l'utilisation des mots réservés, je n'avais même pas repéré "date", je me fais vieux ou taupe... ou les deux

    Bien vu al1_24

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 788
    Points
    30 788
    Par défaut
    C'est juste mon éditeur (notepad++) qui l'a mis en évidence
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    @escartefigue , la requête me donne absolument le même résultat que la requête initiale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    select e.matricule
         , e.nom
         , e.prenom 
         , coalesce(subq.counter, 0)
         , subq.dt
    from employe e
    left join 
         (select c.dt
               , t.matricule
               , count(t.id) as counter  -- identifiant de la tâche
          from calendar c
          left join tasks t 
            on t.datee = c.dt
          group by c.dt
                 , t.matricule
         ) as SUBQ
       on SUBQ.matricule = E.matricule
    @al1_24
    La requête fonctionne très bien avec un calendrier de 3 jours quand j'ai fait le test, sauf que en l'appliquant sur un calendrier de 321 jours sql bug. J'ai remplacé le champs date par datee.
    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2017, 09h31
  2. Compter un nombre d'occurences par période mobile
    Par discus23 dans le forum SAS Base
    Réponses: 1
    Dernier message: 08/02/2017, 10h24
  3. [XL-2003] Compter le nombre de jours par mois entre deux dates
    Par Mikayel dans le forum Excel
    Réponses: 8
    Dernier message: 23/09/2016, 13h36
  4. Compter le nombre d'occurence d'un caractère donné, par ligne du fichier
    Par Bktero dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 23/03/2011, 15h47
  5. [SQL] Compter le nombre d'occurences dans une table par valeur
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 17h22

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