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

SQL Oracle Discussion :

Requete particuliere pour pointage de personnes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 95
    Par défaut Requete particuliere pour pointage de personnes
    Bonjour.
    Voici mon problème: j'ai une table qui se remplie en fonction de pointages de personnes, voici l'exemple des lignes d'enregistrements:

    Nom |Type de pointage|Date
    Personne X |Entree |28/03/2008 07:30:20
    Personne Y |Entree |28/03/2008 07:33:20
    Personne Z |Entree |28/03/2008 07:34:20
    Personne Y |Sortie |28/03/2008 10:00:20
    Personne Y |Entree |28/03/2008 10:30:20
    Personne Z |Sortie |28/03/2008 11:30:20

    Bref, comment savoir grace a une requête le nombre de personne actuellement dans les locaux au moment ou j'interroge la table?

    Merci

  2. #2
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Exemple ( j'ai réduit un peu en supposant que ce n'etait pas la peine de chercher si les personnes entrées depuis plus de 2 jours sont toujours là)
    Cet exemple ne fait pas ce que tu veux, je sais (mais c'est une bonne piste)

    De plus il faut certaines informations pour repondre notamment
    La personne peut elle entrer et sortir plusieurs fois par jour ?
    (si oui ca complique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- Personne sortie (date de sortie > date d'entrée)  ( attention l'inverse ne marche pas)
    select * from 
    -- personne entree depuis plus de 2 jours 
    (select Personne,date from table where type="entree" and date  > sysdate -2)  A,
    -- personne sortie depuis plus de 2 jours 
    (select Personne, date  from table where type="sortie" and date  > sysdate -2) B
    where  A.Personne = B.Personne and A.date <= B.date

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 95
    Par défaut suite...
    Oui la personne peut entree et sortir plusieurs fois par jour!

    Cela ne me donne pas un nombre de personnes actuellement dans l'entreprise.
    Merci quand même.

  4. #4
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par cedlannoy Voir le message
    Oui la personne peut entree et sortir plusieurs fois par jour!

    Cela ne me donne pas un nombre de personnes actuellement dans l'entreprise.
    Merci quand même.
    Ben ca fait pile l'inverse

    Maintenant il faut comparer aux personnes entrées

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    En fait ça reviendrait à récupérer les personnes ayant un pointage en entrée dont la date est supérieur à son dernier pointage en sortie.

    soit la table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE POINTAGE ( 
      NOM            VARCHAR2 (10), 
      TYPE_POINTAGE  VARCHAR2 (6), 
      DT_POINTAGE    DATE )
    voici un exemple de requête qui marcherait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select * from
    (select nom,type_pointage, max(DT_POINTAGE) date_max
    from POINTAGE where type_pointage = 'Entree'
    group by nom,type_pointage) A
    where not exists (select 1 from 
    	  	  		 		 (select nom,type_pointage, max(DT_POINTAGE) date_max
    						 from POINTAGE where type_pointage = 'Sortie'
    						 group by nom,type_pointage) B 
    				where A.nom = B.nom and A.date_max<B.Date_max

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Le principe : je cherche la dernière action de la personne de la journée si le type='Entree' je le prendrais.

    On peut faire plus simple ( si les horaires de travail sont de la même journée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT (t.nom)
      FROM (SELECT pointage.*,
                   ROW_NUMBER () OVER (PARTITION BY nom ORDER BY dt_pointage DESC)rn
              FROM pointage
             WHERE TRUNC (SYSDATE) = TRUNC (dt_pointage)) t
     WHERE t.rn = 1 AND t.TYPE = 'Entree'
    Si le système de travail à rotation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT COUNT (t.nom)
      FROM (SELECT pointage.*,
                   ROW_NUMBER () OVER (PARTITION BY nom ORDER BY dt_pointage DESC)rn
              FROM pointage
             WHERE TRUNC (dt_pointage) BETWEEN TRUNC (SYSDATE) - 1 
             AND TRUNC(SYSDATE)) t
     WHERE t.rn = 1 AND t.TYPE = 'Entree'

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/11/2005, 14h06
  2. Requete compliquee (pour une debutante !)
    Par crolland dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/07/2004, 17h44
  3. Requete MySql pour Mambo Open source
    Par azman0101 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/06/2004, 09h34
  4. Requete select pour récupérer les no match entre 2 tables
    Par Celina dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/12/2003, 11h59
  5. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22

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