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

Langage SQL Discussion :

Fusionner deux champs de deux lignes distinctes en une seule et même ligne


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Fusionner deux champs de deux lignes distinctes en une seule et même ligne
    Bonjour,

    J'ai un petit soucis conceptuel en SQL et j'aurais bien besoin de l'avis d'experts en la matière
    J'ai la table suivante qui liste les evenements associés aux entrées/sorties d'une personne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID_EV, HORODATAGE, SENS, ID_PERSONNE
    1, 18/10/2009 12H04, Entree, 34
    2, 18/10/2009 14H04, Entree, 33
    3, 18/10/2009 15H10, Sortie, 34
    1, 18/10/2009 16H27, Entree, 34
    1, 18/10/2009 18H39, Sortie, 34
    4, 18/10/2009 23H10, Sortie, 33
    Ce que je voudrais avoir c'est le résultat suivant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jour, Id_personne,premiere_entree, derniere_entree, premiere_sortie, derniere_sortie
    En fait je veux ce résultat, car il est possible pour une personne d'avoir plusieurs entrée et pas de sortie ou l'inverse, du coup je dois faire des calculs avec ces informations disponible.


    Ma démarche:

    Première tentative:
    - un join des deux requêtes suivantes et un groupage par personne pour avoir les champs sur une seule ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, min(horodatage), max(horodatage)
    from evenement
    group by to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, SENS
    where sens='Entree'
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, min(horodatage), max(horodatage)
    from evenement
    group by to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, SENS
    where sens='Sortie'
    Ca marche, seulement cela ne me paraît pas optimisé (2 run sur une même table de l'ordre du million de lignes)


    Deuxième tentative:
    - je cherche à faire le tout en une requête, j'ai donc commencé par celle la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, min(horodatage), max(horodatage)
    from evenement
    group by to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, SENS
    Cela me donne ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    18/10/2009, 34, Entree, 18/10/2009 12H04, 18/10/2009 16H27
    18/10/2009, 34, Sortie, 18/10/2009 15H10, 18/10/2009 18H39
    Mais là, je ne vois plus la suite pour arriver à l'objectif visé. Peut être un self join ?

    Auriez-vous eventuellement des idées pour arriver à mon résultat ?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser un CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE, min(CASE WHEN sens= 'Entree' THEN horodatage ELSE NULL END) AS premiere_entree, max(CASE WHEN sens= 'Entree' THEN horodatage ELSE NULL END) AS derniere_entree ...
    FROM evenement
    GROUP BY to_char(horodatage,'dd/mm/yyyy'), ID_PERSONNE

  3. #3
    Membre à l'essai
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    En effet c'est si simple quand on a la réponse sous les yeux.

    C'est exactement ce qu'il me fallait je teste ça ce soir

    Merci encore

Discussions similaires

  1. Fusionner les champs de deux requêtes
    Par wulfram dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/05/2008, 09h20
  2. Sum de deux champs sur deux tables différentes
    Par kluh dans le forum Oracle
    Réponses: 11
    Dernier message: 29/09/2005, 18h21
  3. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 20h53
  4. [sql] afficher deux champs de deux tables sans jointure
    Par Hell dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/06/2005, 12h38
  5. comment recuperer deux valeurs de deux champs input
    Par trialrofr dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/02/2005, 22h08

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