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 et SQL. Discussion :

Addition de plusieurs lignes consécutives d'une table


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Addition de plusieurs lignes consécutives d'une table
    Bonjour,

    J'ai un petit problème avec requête.

    J'ai une base de données d'employés avec plusieurs tables, je vais vous en enumérer quelques unes :
    • TblEmployes qui contient les noms des employés, et leur adresses, etc.
    • TblEmbauche qui contient les dates d'embauche et de départ de chaque employés qui se réfèrent à la TblEmployes
    • TblSpecialisation qui se réfère à la tblEmbauche et nous donnes toutes les noms de l'équipe et du superviseur que l'employé à connu depuis son embauche ainsi que les début et fin de début de poste
    • TblTypedeSpécialisation qui m'inscrit dans quelles "familles" chaque spécialisation se trouvent dans l'organigramme de l'entreprise. Cette table se réfèrent à TblSpécialisation


    Il y a 2 familles qu'on va appeller Légumes et Fruits pour simplifier .

    J'ai besoin de créer une requête qui me permettra de savoir les employés actifs qui font parties de la "famille" Fruits depuis au mois un an consécutif (365 jours), ils peuvent faire partie de l'équipe pommes ou oranges, cela ne m'importe peu. L'important c'est comment je fait pour calculer plusieurs journées consécutives sur plusieurs lignes de données. S'ils ont été transférés entre temps dans la "famille" légumes se n'ai pas bon non plus.

    Est-ce que c'est avec une requête union que je pourrais la générer, mes connaissances de SQL sont plutôt limité, mais je vais tenter le coup .

    Si vous avez besoin de plus d'informations, n'hésitez pas à me poser des questions.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Personnellement voici comment je procéderai

    1. Définir la période de référence : Date()-365j à Date() si tu veux le faire en fonction de la date du jour.
    2. Créer une requête qui te donne pour chaque employé leur période de travail (début - fin) et la famille dans laquelle ils ont travaillé. En utilisant ta table TblSpecialisation tu devrait être capable d'avoir cela.
    3. Créer une requête, basée sur la requête précédente, qui filtre la famille, les employé actifs et qui calcule le nombre de jours correspondant à la période pour chaque enregistrement (La fonction DateDif() va te permettre cela. Attention il faudra ajouter 1 pour que du 1 au 2 cela te donne bien 2 jours).

      Si la période débute en dehors de la période de référence alors faire commencer le calcul du nombre de jours à la date de début de période de référence (utiliser la fonction IIF())

      Si la période fini en dehors de la période de référence alors faire finir le calcul du nombre de jours à la date de fin de période de référence (utiliser la fonction IIF())
    4. Créer une requête, basée sur la requête précédente, qui fait l'addition (requête de regroupement, bouton en forme 3 inversé dans le designer de requête) des jours travaillés pour chaque employé
    5. Créer une requête, basée sur la requête précédente, qui sélectionne tous ceux qui ont 365j travaillés au total sur une période de 365j donc tous les gens qui travaillent dans la famille choisi sans discontinuité depuis au moins un an.

      Note que cette requête ne te donnera pas le temps total travaillé dans la famille depuis la date d'embauche mais seulement le temps travaillé dans les dernier 365j. C'est cette astuce qui permet de s'assurer de la continuité du service.


    On aurait pu faire cela en moins d'étapes mais c'est plus facile à suivre pas à pas.

    A+

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 884
    Points : 58 499
    Points
    58 499
    Billets dans le blog
    45
    Par défaut
    bonsoir,

    Que je comprenne bien…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Employé	DateDebut	DateFin		Type
    1	01/01/2010	12/04/2010	fruit
    1	13/04/2010	15/11/2010	fruit
    1	16/11/2010	12/12/2010	légume
    1	13/12/2010	15/04/2011	fruit
    2	01/01/2010	25/11/2010	légume
    2	26/11/2010	15/01/2011	légume
    L’employé 1 a travaillé plus d’un an dans "fruit" mais comme il n’a pas travaillé un an consécutivement (à cause de l’interruption "légume" du 16/11 au 12/12/2010) tu ne le retiens pas, c’est ça ?
    Par contre pour l’employé 2 c’est OK, il a travaillé du 01/01/2010 au 15/01/2011 dans "légume" sans interruption "fruit", soit plus d’un an.

    J’ai bon jusque-là ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Réponse à F-Leb
    Oui, c'est exactement cela, il faut que l'employé est été dans la même famille (fruit, légume) pendant un 1 an consécutif.

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 884
    Points : 58 499
    Points
    58 499
    Billets dans le blog
    45
    Par défaut
    Ben tu tombes bien alors , ce type de sujet a été récemment traité ici...et ce n'est pas si simple

    Donc si on part de la table/requête TblSpecialisation :
    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
    ---------------------------------------------------------------------------------
    |     idEmploye     |     DateDebut     |      DateFin      |       Type        |
    ---------------------------------------------------------------------------------
    |                 1 |        01/01/2010 |        12/04/2010 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        13/04/2010 |        15/11/2010 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        16/11/2010 |        12/12/2010 | légume            |
    ---------------------------------------------------------------------------------
    |                 1 |        13/12/2010 |        15/04/2011 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        16/04/2011 |        01/06/2011 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        02/06/2011 |        27/09/2011 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        28/09/2011 |        01/02/2012 | fruit             |
    ---------------------------------------------------------------------------------
    |                 2 |        01/01/2010 |        25/11/2010 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        26/11/2010 |        15/01/2011 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        16/01/2011 |        03/04/2011 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        04/04/2011 |        05/06/2011 | fruit             |
    ---------------------------------------------------------------------------------
    |                 2 |        06/06/2011 |        12/09/2011 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        13/09/2011 |        08/12/2011 | légume            |
    ---------------------------------------------------------------------------------
    Alors si tu as du mal comme moi à rédiger des requêtes de 40 lignes SQL, il reste la méthode douce en passant par une requête intermédiaire RSpecConsec avec une colonne calculée [Periode] par du VBA :
    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
    -----------------------------------------------------------------------------------------------------
    |     idEmploye     |     DateDebut     |      DateFin      |       Type        |      Periode      |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        01/01/2010 |        12/04/2010 | fruit             |                 1 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        13/04/2010 |        15/11/2010 | fruit             |                 1 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        16/11/2010 |        12/12/2010 | légume            |                 2 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        13/12/2010 |        15/04/2011 | fruit             |                 3 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        16/04/2011 |        01/06/2011 | fruit             |                 3 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        02/06/2011 |        27/09/2011 | fruit             |                 3 |
    -----------------------------------------------------------------------------------------------------
    |                 1 |        28/09/2011 |        01/02/2012 | fruit             |                 3 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        01/01/2010 |        25/11/2010 | légume            |                 1 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        26/11/2010 |        15/01/2011 | légume            |                 1 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        16/01/2011 |        03/04/2011 | légume            |                 1 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        04/04/2011 |        05/06/2011 | fruit             |                 2 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        06/06/2011 |        12/09/2011 | légume            |                 3 |
    -----------------------------------------------------------------------------------------------------
    |                 2 |        13/09/2011 |        08/12/2011 | légume            |                 3 |
    -----------------------------------------------------------------------------------------------------
    Le groupement par [idEmploye] et [Periode] rend les choses beaucoup plus simples :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    R.idEmploye, 
    Min(R.DateDebut) AS PeriodeDebut, 
    Max(R.DateFin) AS PeriodeFin, 
    R.Type AS TypeSpec, 
    FROM RSpecConsec AS R
    GROUP BY R.idEmploye, R.Type, R.Periode
    ORDER BY R.idEmploye, Min(R.DateDebut);

    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
    ---------------------------------------------------------------------------------
    |     idEmploye     |   PeriodeDebut    |    PeriodeFin     |     TypeSpec      |
    ---------------------------------------------------------------------------------
    |                 1 |        01/01/2010 |        15/11/2010 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        13/12/2010 |        01/02/2012 | fruit             |
    ---------------------------------------------------------------------------------
    |                 1 |        16/11/2010 |        12/12/2010 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        04/04/2011 |        05/06/2011 | fruit             |
    ---------------------------------------------------------------------------------
    |                 2 |        01/01/2010 |        03/04/2011 | légume            |
    ---------------------------------------------------------------------------------
    |                 2 |        06/06/2011 |        08/12/2011 | légume            |
    ---------------------------------------------------------------------------------
    Ne reste qu’à rajouter un calcul de durée de la période avec un filtre sur les périodes supérieures à 1 an...
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/08/2010, 08h29
  2. Réponses: 3
    Dernier message: 24/10/2008, 20h31
  3. Réponses: 2
    Dernier message: 22/10/2008, 18h53
  4. Réponses: 6
    Dernier message: 05/08/2006, 11h54
  5. [SQL] Récupérer plusieurs lignes spécifiques d'une table
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/04/2006, 20h49

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