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 :

Agrégation SQL sur plusieurs Date/Heure


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut Agrégation SQL sur plusieurs Date/Heure
    Bonjour,

    Je débute dans le SQL et je rencontre des problèmes avec une requête sur Oracle.

    Voici les données du problème :
    • un user peut intervenir sur une tâche ou plus
    • une tâche peut être traitée par un user ou plus (A et B)
    • la quantité est fixe pour une tâche (pas de somme à faire sur cette colonne lors de l'agrégat)

    Le but étant d'avoir le suivi de chaque user par tâche.

    Je souhaite récupérer en agrégeant pour chaque user et mission : l'user, la mission, la date et heure de début de l'intervention de l'user sur la mission et la date et heure de fin d'intervention.

    Table :
    AGENT ;MSSION ;debut ;fin  ; HEURE DEBUT;HEURE FIN; QT	
    A;45;02/02/11;02/02/11; 8H40; 8H43;50
    A;45;02/02/11;02/02/11; 9H25;10H48;50
    A;45;03/02/11;03/02/11;11H25;12H48;50
    B;45;02/02/11;02/02/11;13H25;13H48;50
    B;45;03/02/11;03/02/11;15H25;16H48;50
    B;45;04/02/11;04/02/11;16H25;16H48;50
    C;44;02/02/11;02/02/11;16H58;17H50;80
    C;44;02/02/11;02/02/11;20H30;21H30;80
    Résultat attendu :
    AGENT ;tache ;debut ;fin  ; HEURE DEBUT;HEURE FIN; qT
    A;45;02/02/11;03/02/11; 8H40;12H48;50
    B;45;02/02/11;04/02/11;13H25;16H48;50
    C;44;02/02/11;02/02/11;16H58;21H30;80
    Merci beaucoup de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    quelles requêtes avez-vous testé ?

    Avez-vous une primary key sur cette table où est-elle tout simplement très mal modélisée ?

    Bref dans tous les cas si vous concédez d'avoir en résultat des timestamp pour vos date de début / fin une solution assez simple pourra être trouvée avec

    ceci :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    Et ceci :
    http://www.dba-oracle.com/f_to_date.htm

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour et merci de votre réponse.

    Voici la requête que je teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      select agent, tache, min(date_debut), min(heure_deb), max(date_fin), max(heure_fin), qt
        from table
    group by user, tache, qt
    La table et le résultat que je dois obtenir est dans mon premier post.

    Merci de votre aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Attention : dans le select vous avez agent, dans le group by c'est user.
    User est un mot réservé qui indique le compte utilisateur avec lequel vous êtes connecté à la base de données :
    Sinon votre requête me paraît un bon début : ce qui pêche aussi ce sont les heures parce qu'elles sont stockées dans une colonne de format littéral type varchar2 !

    Vos heures devraient être incluses dans vos dates de début et de fin.
    Pouvez-vous modifier la structure de la table ou êtes-vous condamné à l'utiliser en l'état ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci
    Je rencontre un nouveau problème au niveau du calcul de la différence entre deux dates dans oracle.
    En fait le :

    date1
    to_char(ah.import_date, 'DD/MM/YYYY HH24:MI:SS') ,
    retourne 30/03/2011 10:51:13

    date2
    to_char(ol.load_date, 'DD/MM/YYYY HH24:MI:SS') ,
    retourne 13/04/2011 16:49:50

    Je n'arrive pas à faire la différence entre DATE1 et DATE2 pour obtenir le nombre d'heures dans oracle.
    Avez vous une idée ?
    Merci beaucoup

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    La soustraction de deux dates renvoie un résultat en nombre de jour.
    Il suffit donc de le multiplier par 24.
    À vous de voir ensuite si vous désirez un arrondi ou un truncate de ce nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (ol.load_date - ah.import_date) * 24 as heures_diff

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Waldar Voir le message
    La soustraction de deux dates renvoie un résultat en nombre de jour.
    Il suffit donc de le multiplier par 24.
    À vous de voir ensuite si vous désirez un arrondi ou un truncate de ce nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (ol.load_date - ah.import_date) * 24 as heures_diff


    Merci beaucoup ..
    Oracle me retourne un invalid number. Est-ce que c'est lié au format du champ date ?
    Encore merci

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    de quel type sont vos colonnes load_date et import_date ?

    Si ce sont des char / varchar ne cherchez pas plus loin.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par punkoff Voir le message
    de quel type sont vos colonnes load_date et import_date ?

    Si ce sont des char / varchar ne cherchez pas plus loin.
    Super ça fonctionne très bien et j'obtiens bien le nombre de jours de différence que je multiplie par 24..
    La demande a évoluée depuis hier, en effet, je dois enlever également le nombre de jours NON OUVRE qui se trouve dans une table de référence :

    DATE TIME ; OUVRE
    DD/MM/YYYY ; 0 ce qui signifie non OUVRE et 1 pour OUVRE

    Est-ce que je dois passer par un count distinct des non ouvrés et l'intégrer dans ma différence ?
    Merci

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    pourquoi un distinct ?

    Mais une sous requête oui ca me semble le plus intéressant

  11. #11
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    C'est bon un exemple ci dessous
    Cdt,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT TP.NM, TP.DTDEB, TP.DTFIN,
             COALESCE(SUM(LEAST(CL.DAY + 1, TP.DTFIN) - GREATEST(CL.DAY, TP.DTDEB)), 0) AS JOURS_NON_OUVRES
        FROM TEMP TP
             LEFT OUTER JOIN CALENDAR CL
               ON CL.DAY BETWEEN TRUNC(TP.DTDEB) AND TRUNC(TP.DTFIN)
              AND (CL.DAY_NUMBER IN (6, 7) OR CL.FG_HOLIDAY = 1)
    GROUP BY TP.NM, TP.DTDEB, TP.DTFIN
    ORDER BY TP.NM ASC;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] Ecrire une requete SQL sur plusieurs lignes!
    Par big x dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/05/2006, 17h28
  2. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 11h59
  3. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 17h32
  4. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 15h47
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 17h26

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