Bonsoir Fred,
Ton problème demande un peu de travail ![;)](https://www.developpez.net/forums/images/smilies/icon_wink.gif)
Je vais donc essayer de t'aider:
En fait si çà ressemble aux taux d'occupations des chambres d'hôtel...
(on calcule le nombre de nuits pour chaque client et on fait le total par mois)
Dans ce cas, tu peux calculer les effectifs pour chaque mois de l'année (paramètre).
Pour ce faire, il te faut créer 2 tables en plus de ta table T_Presence:
T_Jour(Jour:Entier)
cette table contient les jours du mois, les valeurs 1,2,3...31
T_Mois(Mois:Entier)
cette table contient les mois de l'année, les valeurs 1,2,3...12
Et ta table:
T_Presence(Nom_Personne:Texte, Date_Arrivée: Date, Date_Sortie: Date)
====================================================
LES REQUETES:
R_Jour(DateJ: Date)
cette requête réalise le produit cartésien des tables T_Jour, T_Mois et affiche tous les jours de l'année choisie, elle a comme paramètre l'année choisie:[An]
Son sql:
1 2 3 4 5
| PARAMETERS [An] Value;
SELECT DateSerial([An],[Mois],[Jour]) AS DateJ
FROM T_Jour, T_Mois
WHERE (((DateSerial([An],[Mois],[Jour]))<DateSerial([An],[Mois]+1,1)))
ORDER BY DateSerial([An],[Mois],[Jour]); |
---------------
R_JourPersonne(DateJ: Date, Nom_Personne: Texte)
cette requête basée sur la table T_Presence et la requête R_Jour affiche les noms des personnes et les jours de présence.
Son sql:
1 2 3
| SELECT R_Jour.DateJ, T_Presence.Nom_Personne
FROM R_Jour, T_Presence
WHERE (((R_Jour.DateJ) Between [Date_Arrivée] And ([Date_Sortie]-1))); |
---------------
La requête qui t'intéresse:
Cette requête affiche les effectifs par mois:
R_MoisNbrePersonne(DateJ: Date, Nbre_Personne: Entier)
cette requête basée sur la requête R_JourPersonne et la requête R_Jour affiche les effectifs des personnes pour chaque mois de l'année.
Son sql:
1 2 3
| SELECT Format([DateJ],"mm/yyyy") AS Mois, Count(R_JourPersonne.Nom_Personne) AS Nbre_Personnes
FROM R_Jour LEFT JOIN R_JourPersonne ON R_Jour.DateJ = R_JourPersonne.DateJ
GROUP BY Format([DateJ],"mm/yyyy"); |
=====================================================
Ou encore,
Pour la requête qui t'intéresse:
si les jours de présence couvre tous les mois de l'année, tu peux simplifier le tout avec cette requête:
R_MoisNbrePersonne2(DateJ: Date, Nbre_Personne: Entier)
cette requête basée sur la table T_Presence et la requête R_Jour affiche les effectifs des personnes pour chaque mois de l'année.
Son sql:
1 2 3 4 5
| SELECT Format([DateJ],"mm/yyyy") AS Mois, Count(T_Presence.Nom_Personne) AS CompteDeNom_Personne
FROM R_Jour, T_Presence
WHERE (((R_Jour.DateJ) Between [Date_Arrivée] And ([Date_Sortie]-1)))
GROUP BY Format([DateJ],"mm/yyyy")
ORDER BY Format([DateJ],"mm/yyyy"); |
A+
Note que si tu comptes le jour de sortie, tu peux remplacer dans les requêtes:
R_Jour.DateJ Between [Date_Arrivée] And ([Date_Sortie]-1)
par
R_Jour.DateJ Between [Date_Arrivée] And [Date_Sortie]
Voici la base exemple (Format Access 2000):
base1.zip
===================================================
===================================================
Si tu souhaites juste calculer le nombre de personnes étant passés
sur le chantier pour chaque mois de l'année, alors tu peux faire:
LES REQUETES:
R_Mois(Année: Entier, Mois: Entier)
cette requête est basée sur la table T_Mois et affiche tous les mois de l'année accompagnée de l'année choisie, elle a comme paramètre l'année choisie:[An]
Son sql:
1 2 3
| PARAMETERS [An] Value;
SELECT T_Mois.Mois, [An] AS Année
FROM T_Mois; |
R_MoisPers(Année: Entier, Mois: Entier, Nom_Personne: Texte)
cette requête basée sur la table T_Presence et la requête R_Mois affiche les noms des personnes et les mois de présence.
Son sql:
1 2 3
| SELECT R_Mois.Année, R_Mois.Mois, T_Presence.Nom_Personne
FROM R_Mois, T_Presence
WHERE (((T_Presence.Date_Arrivée)<DateSerial([Année],[Mois]+1,1)) AND ((T_Presence.Date_Sortie)>DateSerial([Année],[Mois],1))); |
Enfin la requête qui t'intéresse:
R_MoisNbrePers(Mois: Integer, Nbre_Personne: Entier)
cette requête basée sur la requête R_MoisPers et la requête R_Mois affiche les effectifs des personnes pour chaque mois de l'année.
Son sql:
1 2 3 4
| SELECT R_Mois.Mois, Count(R_MoisPers.Nom_Personne) AS Nbre_Personne
FROM R_Mois LEFT JOIN R_MoisPers ON (R_Mois.Année = R_MoisPers.Année) AND (R_Mois.Mois = R_MoisPers.Mois)
GROUP BY R_Mois.Mois
ORDER BY R_Mois.Mois; |
Sinon il faut davantage préciser ta demande et alors on pourra adapter ces requêtes à ton problème...
A+
Partager