Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 17h40   #1
Invité de passage
 
Homme
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 4
Points : 4
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.
bisk32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 22h00   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
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+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 22h15   #3
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 414
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 414
Points : 4 445
Points : 4 445
bonsoir,

Que je comprenne bien…

Code :
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à ?
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 19h01   #4
Invité de passage
 
Homme
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 4
Points : 4
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.
bisk32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 21h21   #5
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 414
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 414
Points : 4 445
Points : 4 445
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 :
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 :
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 :
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 :
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
Type de fichier : zip Employe.zip (20,3 Ko, 5 affichages)
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h39.


 
 
 
 
Partenaires

Hébergement Web