Salut tout le monde !!!
Je Suis en Stage et j’aimerais calculer le nombre de retards d’un employé
On ne prend en considération un retard que quand l’employé dépasse 8:15:00.
sachant que je dispose de la base de données suivante:
voila la requete que j’ai pu faire donc si vous pouvez m’aider merci d’avance
SELECT DISTINCT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) As [inf],
CONVERT(varchar(20), MaDate, 108) As [time],
FROM Matable
WHERE CONVERT(varchar, Madate, 103) = ‘02/01/2007’
AND readerdescription like ‘Entree’
GROUP BY MAtricule, Nom, Madate
HAVING (CONVERT(varchar(20), Madate, 108)) > ‘08:15:00.00’
ça marche mais le problème c’est qu’elle me retourne pour un employé tous les entrées apré 08h15, é moi je veux seulement le premier
fais un select avec juste matricule dans un premier temps
pour ressortir uniquement la date au plus tôt de chaque employé je pense qu’il faudra faire une requête imbriquée
une remarque non technique cependant en supposant que ton salarié pointe:
=> Il va pointer 4 fois: une fois le matin en entrée, une fois le midi en sortie, une autre fois le midi en entrée et une fois le soir en sortie
=> S’il oublie de pointer une fois, tu vas obtenir un décalage entre “Entrée” et “Sortie”
voilà pourquoi j’oublierai ce paramètre dans la requête à ta place
Au temps pour moi, sur SQL server, il n’y a pas de fonction date/time, donc tu es obligé d’utiliser les convert:
SELECT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108))
FROM Matable
WHERE CONVERT(varchar, Madate, 103) = '02/01/2007'
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom
pas de having qui porte sur des condition après le groupement.
Le groupement “group by” ne doit porter que sur les colonnes en commun sur les résultats regroupés (+ les fonctions d’aggrégation min, max …).
si tu met la date ou l’heure dans le groupement, vur que c’est différent pour tout le monde, ça ne regroupe plus rien
d’autre part, on emploi distinct ou group by, mais pas les 2 à la fois.
SELECT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) , CONVERT(varchar, Madate, 103) as jour
FROM Matable
WHERE
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)
encore * UN GRAAAAAAND MERCI A DELTREE … LE SAUVETEUR de cette discution
SELECT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) , CONVERT(varchar, Madate, 103) as jour
FROM Matable
WHERE
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)
la requete retourne pour chaque jour le cumule du retard
moi je veux un champ pour le nombre de retard par mois et un champ pour le cumule general
dsl je suis un debutant ^^
j’ai fais dans un select apart
sum(CONVERT(datetime,(min(CONVERT(datetime ,Madate, 108))-‘08:15:00.00’ ), 108))
et voila l’erreur
Serveur : Msg 130, Niveau 15, État 1, Ligne 14
Impossible d’exécuter une fonction d’agrégation sur une expression comportant un agrégat ou une sous-requête.
Vraiment pas de quoi… (évite le majuscules :whistle: )
les fonctions d’aggrégation sont spéciales, on ne peut pas appeler une fonction d’aggrégation dans une autre, on n’en met qu’une (par colonne bien sûr)
La il faut passer par des requêtes imbriquées, ou utiliser le résultat dans un langage, (VB, PHP ou autre) qui fera tes totaux.
--éventuellement ajouter un calcul de somme des retards avec la différence , sum(CONVERT(datetime,heure, 108)-'08:15:00.00' )
select MAtricule, Nom , jour, count(*) as nb from
(SELECT MAtricule, Nom, MIN(CONVERT(datetime ,Madate, 108)) as heure , CONVERT(varchar, Madate, 103) as jour
FROM Matable
WHERE
MONTH ( MaDate) = 1
and (CONVERT(varchar(20), Madate, 108)) > '08:15:00.00'
AND readerdescription = 'Entree'
GROUP BY MAtricule, Nom, CONVERT(varchar, Madate, 103)
) retard
group by MAtricule, Nom, jour
Oui, il faut grouper par jour aussi (corrigé)
j’ai mis month(MaDate)=1 pour sélectionner janvier, si tu enlève ça, ça te retournera toute l’année.
Je pense que tu n’a pas de données sur la sélection de janvier
siisiiii
tous les enregisrement que j’en ai , ce sont a Janvier
-------------------------- --------------------------
je sais plus quoi te dire Deltree pour te remercié…vraiment u m’a trop aider
…
j’ai troouver une autre requete, je vais la poster demain inchalah, pour le bien de out le monde, et pour l’echange d’informations biensure
select Matricule , Nom ,count(Matricule)as Nombre_Retard , sum(DATEPART (minute,convert(datetime,Durée))+ DATEPART (hour,convert(datetime,Durée))*60) as Cumule_Retard
from (SELECT Matricule, Nom,(min(CONVERT(datetime ,MaDate, 108)))as entree, CONVERT(varchar(20),(min(CONVERT(datetime ,MaDate, 108))-'08:15:00.00' ), 108)as Durée ,
CONVERT(varchar, MaDate, 103) as jour
FROM Matable
WHERE MONTH (MaDate) = 1
and (CONVERT(varchar(20), MaDate, 108)) > '08:15:00.00'
AND Etat like 'Entrer'
GROUP BY Nom,Matricule, CONVERT(varchar, MaDate, 103)) as rr
group by Matricule,Nom
Merci encore a Deltree
```
select Matricule , Nom ,count(Matricule)as Nombre_Retard , sum(DATEPART (minute,convert(datetime,Durée))+ DATEPART (hour,convert(datetime,Durée))*60) as Cumule_Retard
from (SELECT Matricule, Nom,(min(CONVERT(datetime ,MaDate, 108)))as entree, CONVERT(varchar(20),(min(CONVERT(datetime ,MaDate, 108))-‘08:15:00.00’ ), 108)as Durée ,
CONVERT(varchar, MaDate, 103) as jour
FROM Matable
WHERE MONTH (MaDate) = 1
and (CONVERT(varchar(20), MaDate, 108)) > ‘08:15:00.00’
AND Etat like ‘Entrer’
GROUP BY Nom,Matricule, CONVERT(varchar, MaDate, 103)) as rr
group by Matricule,Nom
et ça marche?
=> “Entrer” au lieu de “Entrée”???
accessoirement, relis ma remarque pratique, je ne ferais pas de filtre sur ce critère mais plutôt sur les horaires.