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 les personnes


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut Compter les personnes
    Bonjour à tous,

    je suis toujours dans mon comptage de personnel dans un planning.

    Voici de manière simplifiée ce que ma table "presences" contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ---------------------------------------------------------------
    | nom  | heure de début de présence | heure de fin de présence |
    ---------------------------------------------------------------
    |  A    |         07h30             |         12h30           |
    |  B    |         11h30             |         16h00           |
    |  C    |         14h30             |         18h00           |
    |  D    |         15h00             |         19h00           |
    ---------------------------------------------------------------
    J'essaye de monter une requête qui me compte le nombre de personnes présentes par créneau.

    Dans ce cas présent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    debut -  fin    - nombre de personnes:
    07h30 - 11h30 -                1
    11h30 - 12h30 -                2
    12h30 - 14h30 -                1
    14h30 - 15h00 -                2
    15h00 - 16h00 -                3
    16h00 - 18h00 -                2
    18h00 - 19h00 -                1
    Je torture les COUNT et les GROUP BY mais sans résultat.

    Pouvez-vous m'éclairer ?

    Par avance merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT debut, fin, COUNT(*) nbrPersonne
    FROM presences
    GROUP BY debut, fin
    Par contre si tu a un couple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ---------------------------------------------------------------
    | nom  | heure de début de présence | heure de fin de présence |
    ---------------------------------------------------------------
    |  A    |         07h30             |         12h30           |
    |  B    |         07h30             |         10h00           |
    ---------------------------------------------------------------
    ces deux lignes seront compter différement malgré le fait que la ligne B soit dans l'interval de A.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Commençons simplement...

    Combien de présents entre 7h30 et 11h30 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) AS nb_presents
    FROM presence
    WHERE debut_presence BETWEEN '07:30:00' AND '11:30:00'
    	OR fin_presence BETWEEN '07:30:00' AND '11:30:00'
    Comme tu as plusieurs périodes à tester, il te faut une table des périodes.
    Essaie ceci si tu n'a spas besoin de la table de façon permanente (pas sûr de la syntaxe pour la table temporaire) :
    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
    CREATE TEMPORARY TABLE tmp_periode (debut TIME, fin TIME);
     
    INSERT INTO tmp_periode
    VALUES ('07:30:00', '11:30:00'),
    	('11:30:00', '12:30:00'),
    	('12:30:00', '14:30:00'),
    	('14:30:00', '15:00:00'),
    	('15:00:00', '16:00:00'),
    	('16:00:00', '18:00:00'),
    	('18:00:00', '19:00:00');
     
    SELECT t.debut, t.fin,
    	COUNT(p.nom) AS nb_presents
    FROM presence p
    INNER JOIN tmp_periode t
    	ON p.debut_presence BETWEEN t.debut AND t.fin
    		OR p.fin_presence BETWEEN t.debut AND t.fin
    GROUP BY t.debut, t.fin
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Voici une approche dynamique sur la gestion des bornes debut/fin :
    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
    31
    32
    33
    34
    35
    36
    37
    mysql> select h.debut, h.fin, count(*) as nb
        ->   from (
        -> select debut.heure as debut, min(fin.heure) as fin
        ->   from (select heure_debut_presence as heure from t union
        ->         select heure_fin_presence            from t
        ->        ) debut
        ->   join (select heure_debut_presence as heure from t union
        ->         select heure_fin_presence            from t
        ->        ) fin on fin.heure > debut.heure
        ->  group by debut.heure
        ->        ) as h
        ->   left join t on t.heure_debut_presence <= h.debut and t.heure_fin_presence >= h.fin
        ->  group by h.debut, h.fin;
    +----------+----------+----+
    | debut    | fin      | nb |
    +----------+----------+----+
    | 07:30:00 | 11:30:00 |  1 |
    | 11:30:00 | 12:30:00 |  2 |
    | 12:30:00 | 14:30:00 |  1 |
    | 14:30:00 | 15:00:00 |  2 |
    | 15:00:00 | 16:00:00 |  3 |
    | 16:00:00 | 18:00:00 |  2 |
    | 18:00:00 | 19:00:00 |  1 |
    +----------+----------+----+
    7 rows in set (0.00 sec)
     
    mysql> desc t;
    +----------------------+-------------+------+-----+---------+-------+
    | Field                | Type        | Null | Key | Default | Extra |
    +----------------------+-------------+------+-----+---------+-------+
    | nom                  | varchar(10) | YES  |     | NULL    |       |
    | heure_debut_presence | time        | YES  |     | NULL    |       |
    | heure_fin_presence   | time        | YES  |     | NULL    |       |
    +----------------------+-------------+------+-----+---------+-------+
    3 rows in set (0.05 sec)
     
    mysql>
    Il doit être possible de créer une table temporaire à partir de la sous-requête h.

    S'il n'est pas nécessaire de gérer les bornes debut/fin dynamiquement alors crée une table des périodes comme proposé par cinephil.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 31
    Par défaut
    Bonjour,

    merci à tous pour vos différentes approches.

    C'est parfait.

    Bonne journée.

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

Discussions similaires

  1. Compter les syllabes d'un mot français
    Par david_chardonnet dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2014, 10h57
  2. Réponses: 19
    Dernier message: 03/08/2004, 10h26
  3. [langage] compter les retour à la ligne
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2004, 16h36
  4. [C#] Compter les lignes d'un DataSet
    Par alexischmit dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/04/2004, 15h17
  5. Compter les valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 6
    Dernier message: 30/03/2004, 13h29

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