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

Oracle Discussion :

Récupérer une différence de date pour une même colonne


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Récupérer une différence de date pour une même colonne
    Bonjour,

    Avant tout de chose je tiens à dire que je ne suis absolument pas à l'aise avec le sql oracle donc ma question va vous paraître sans doute basique.

    J'ai en gros 3 tables dont 2 tables qui ne servent qu'à récupérer des champs de regroupêment et une 3eme qui récupère les données dont j'ai besoin sous forme de date afin de calculer des différences. Le problème porte sur cette 3eme table.
    J'ai pu faire mes calculs entre mes colonnes de date différente mais le problème est que j'ai un calcul qui s'effectue sur une même colonne de date de la même table et qui change en fonction d'une valeur d'une autre colonne (qui n'est pas une clé).
    En gros cela se présente sous cette forme

    TABLE T3
    date / code action
    10/12/2003 DEIN
    22/12/2003 DOAA
    15/3/2004 AIN
    17/5/2003 DEIN
    1/2/2003 DOAA
    10/10/2003 AIN
    2/2/2003 DEIN
    3/4/2004 DOAA
    1/1/2003 AIN
    Bon il y a plus de valeurs code en réalité...

    Je cherche à faire la différence entre les dates qui ont la valeur DOAA avec celle de DEIN sans me préocupper du reste(les date doivent êtres filtré que sur ces 2 valeurs).

    J'ai penser à 3 moyens différents pour y arriver: l'auto-jointure, la création de vue et les requêtes imbriquées.
    Créer des vues qui effectue les calculs et les joindre à la requête principale n'est pas vraiment possible car je n'ai pas la main directement sur la base, mais je passe par un requeteur (harry) qui ne reconnait pas les vues que je crée. Les requêtes imbriqués j'aimerais éviter si possible, car on m'a demandé d'écrire une requête simple et maintenable et j'ai un peu peur de tomber dans une usine à gaz.

    Donc mes question sont les suivantes:
    Quel est la meilleur conception et le moyen le plus simple pour récupérer ce résultat?

    J'ai essayé l'autojointure en voulant mettre une date filtrée sur un code pour une table et la même date filtré sur l'autre code dans l'autre table mais en vain.

    Voici mon code (j'ai mis en gras le calcul du champs concerné).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT ALL
    	A.CD_ACTION,
    	B.CD_ACTION,
    	(CONCAT(C.NOM_AGT_ASR, C.PNOM_AGT_ASR)),
    	(CONCAT((CONCAT(D.CD_DOS_SIEGE, D.DT_CREAT_DOS)), (LPAD( D.NO_DOS , 9,'0' )))),
    	D.LB_DOS,
    	D.DT_CREAT_DOS_BNPPREC,
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))),
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( B.DT_TRTACTION, 'DD' ))),
    	max( (TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))) ),
    	max( (TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( B.DT_TRTACTION, 'DD' ))) )FROM ((T_DWH_AGENT_ASR C RIGHT OUTER JOIN (T_DWH_ACTION A INNER JOIN T_DWH_DOSSIER_DEFAUT D ON A.DT_HISTO=D.DT_HISTO  AND A.DT_CREAT_DOS = D.DT_CREAT_DOS AND A.CD_DOS_SIEGE = D.CD_DOS_SIEGE AND A.NO_DOS = D.NO_DOS) ON C.CD_EG=D.CD_EG AND C.DT_HISTO = D.DT_HISTO AND C.CD_AGT_ASR = D.CD_AGT_ASR AND C.CD_EG = D.CD_EG_BNPPREC) RIGHT OUTER JOIN T_DWH_ACTION B ON A.ETAT_ACTION=B.ETAT_ACTION AND A.ID_ACTION = B.ID_ACTION AND B.NO_DOS = A.NO_DOS AND B.CD_DOS_SIEGE = A.CD_DOS_SIEGE AND B.DT_CREAT_DOS = A.DT_CREAT_DOS)
    WHERE
    	(D.DT_CREAT_DOS_BNPPREC BETWEEN '01/02/2011' AND '21/09/2011')  AND  (A.ETAT_ACTION = 'H')  AND  (A.STATUT_ACTION = 'T')  AND  (A.CD_ACTION = 'DEIN')  AND  (B.CD_ACTION = 'DOAA')
    GROUP BY
    	A.CD_ACTION,
    	B.CD_ACTION,
    	(CONCAT(C.NOM_AGT_ASR, C.PNOM_AGT_ASR)),
    	(CONCAT((CONCAT(D.CD_DOS_SIEGE, D.DT_CREAT_DOS)), (LPAD( D.NO_DOS , 9,'0' )))),
    	D.LB_DOS,
    	D.DT_CREAT_DOS_BNPPREC,
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))),
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( B.DT_TRTACTION, 'DD' )))
    Si il y a une âme charitable pour me donner des pistes et m'éclairer je lui en serais reconnaissant.

    Merci

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est pas super clair niveau des relations entre les tables, et de ce que tu veux.
    Peut être qu'un exemple de données et du résultat obtenu nous aidera

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH t3 AS (					SELECT TO_DATE('10/12/2003', 'DD/MM/RRRR') dte, 'DEIN' action FROM dual
    UNION ALL SELECT TO_DATE('22/12/2003', 'DD/MM/RRRR') dte, 'DOAA' action FROM dual
    UNION ALL SELECT TO_DATE('15/3/2004', 'DD/MM/RRRR') dte, 'AIN' action FROM dual
    UNION ALL SELECT TO_DATE('17/5/2003', 'DD/MM/RRRR') dte, 'DEIN' action FROM dual
    UNION ALL SELECT TO_DATE('1/2/2003', 'DD/MM/RRRR') dte, 'DOAA' action FROM dual
    UNION ALL SELECT TO_DATE('10/10/2003', 'DD/MM/RRRR') dte, 'AIN' action FROM dual
    UNION ALL SELECT TO_DATE('2/2/2003', 'DD/MM/RRRR') dte, 'DEIN' action FROM dual
    UNION ALL SELECT TO_DATE('3/4/2004', 'DD/MM/RRRR') dte, 'DOAA' action FROM dual
    UNION ALL SELECT TO_DATE('1/1/2003', 'DD/MM/RRRR') dte, 'AIN' action FROM dual
     )
     SELECT MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) max_doaa, 
     	MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) max_dein,
            MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) - MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) diff
     FROM t3
     WHERE action IN ('DEIN', 'DOAA')
     
    MAX_DOAA	MAX_DEIN	DIFF
    03/04/2004	10/12/2003	115

  3. #3
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Bonjour,
    tout d'abord, je tiens à te préciser que je n'ai pas bien compris tes explications.
    Donc ma réponse sera juste une piste (peut être hors sujet)

    j'ai eu un cas similaire ou je devais récupérer plusieurs lignes d'une même table et faire des opérations sur une colonne.
    Dans mon cas j'ai créé une nouvelle colonne (int) (nommée "num_enrg") afin d'ordonner mes lignes, un peu comme un incrément, de manière à ce que mes enregistrement suivent une logique de type suite enrgA,enrgB,enrgC...
    en faisant ça, je récupère le numéro "num_enrg" de la ligne enrgA puis je fais un select sur "numenrg+1" pour avoir enrgB, "numenrg+2" pour enrgC ...
    Je m'explique, dans ton cas si tu as toujours la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    num ----- col1
    1 ----- 01/01/2003 DEIN
    2 ----- 08/02/2003 DOAA
    3 ----- 09/02/2003 AIN
    tu pourras utiliser cette colonne pour extraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (num), (num-1) from ta_table where col1 = "condition_sur_DEIN";
    bref, dis moi si ça peux t'aider sinon je retirerai mon post si je suis hors sujet

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci de vos réponses et désolé de vous répondre que maintenant, j’ai dû passer à autre chose temporairement, donc je n’ai rien testé de nouveau.

    Ce n’étais sans doute pas clair, mais ce que je veux est assez simple il s’agit en gros du tableau attaché (en plus allégé).

    Les données correspondant aux colonnes sont :

    nom prénom correspond à (CONCAT(C.NOM_AGT_ASR, C.PNOM_AGT_ASR)) de table agent

    Identifiant correspond à (CONCAT((CONCAT(D.CD_DOS_SIEGE, D.DT_CREAT_DOS)), (LPAD( D.NO_DOS , 9,'0' )))) de table DOSSIER_DEFAUT

    Libellé correspond à LB_DOS de table DOSSIER_DEFAUT

    Date de création à DT_CREAT_DOS_BNPPREC de table DOSSIER_DEFAUT

    DEIN et DOAA correspondent à DT_TRTACTION quand CD_ACTION = DEIN ou CD_ACTION = DOA (le champ à problème) de la table action.
    Délai affectation correspond à (TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))) et fonctionne sans problème.

    Je n’ai aucun mal à tout récupérer sauf pour les délais délai DEIN** jours et mois qui dépendent de la différence des dates DEIN et DOAA qui utilise la même colonne.
    max( (TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( B.DT_TRTACTION, 'DD' ))) ) que j’utilisais dans une auto jointure afin de mettre une condition à DEIN pour l’un et DOAA pour l’autre mais ça ne marche pas.

    Voilà, j’espère que c’est plus clair.

    Concernant l’idée de créer une colonne de chiffre, je n’ai pas la main pour faire ça, et je ne peux même pas créer de vue.

    MCM, je pense que cela se rapproche de ce que je souhaite, donc si je comprends cela donnerais pour ma requête cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    WITH T_DWH_ACTION AS (SELECT TO_DATE(DT_TRTACTION, 'DD/MM/RRRR') dte, 'DEIN' CD_ACTION FROM T_DWH_ACTION
    UNION ALL SELECT TO_DATE(DT_TRTACTION, 'DD/MM/RRRR') dte, 'DOAA' CD_ACTION FROM T_DWH_ACTION)
     
    SELECT 
    A.CD_ACTION,
    	B.CD_ACTION,
    	(CONCAT(C.NOM_AGT_ASR, C.PNOM_AGT_ASR)),
    	(CONCAT((CONCAT(D.CD_DOS_SIEGE, D.DT_CREAT_DOS)), (LPAD( D.NO_DOS , 9,'0' )))),
    	D.LB_DOS,
    	D.DT_CREAT_DOS_BNPPREC,
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))),
     
    MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) max_doaa, 
     	MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) max_dein,
            MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) - MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) diff
      FROM ((T_DWH_AGENT_ASR C RIGHT OUTER JOIN (T_DWH_ACTION A INNER JOIN T_DWH_DOSSIER_DEFAUT D ON A.DT_HISTO=D.DT_HISTO  AND A.DT_CREAT_DOS = D.DT_CREAT_DOS AND A.CD_DOS_SIEGE = D.CD_DOS_SIEGE AND A.NO_DOS = D.NO_DOS) ON C.CD_EG=D.CD_EG AND C.DT_HISTO = D.DT_HISTO AND C.CD_AGT_ASR = D.CD_AGT_ASR AND C.CD_EG = D.CD_EG_BNPPREC) WHERE
    	(D.DT_CREAT_DOS_BNPPREC BETWEEN '01/02/2011' AND '21/09/2011')  AND  (A.ETAT_ACTION = 'H')  AND  (A.STATUT_ACTION = 'T')  AND  A.CD_ACTION IN ('DEIN', 'DOAA')
      GROUP BY
    	A.CD_ACTION,
    	(CONCAT(C.NOM_AGT_ASR, C.PNOM_AGT_ASR)),
    	(CONCAT((CONCAT(D.CD_DOS_SIEGE, D.DT_CREAT_DOS)), (LPAD( D.NO_DOS , 9,'0' )))),
    	D.LB_DOS,
    	D.DT_CREAT_DOS_BNPPREC,
    	(TO_NUMBER(TO_CHAR( A.DT_TRTACTION, 'DD' ))) - (TO_NUMBER(TO_CHAR( D.DT_CREAT_DOS_BNPPREC, 'DD' ))),
    MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) max_doaa, 
     	MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) max_dein,
            MAX(CASE WHEN action = 'DOAA' THEN dte ELSE NULL END) - MAX(CASE WHEN action = 'DEIN' THEN dte ELSE NULL END) diff
    Voilà, encore une fois je précise que je découvre Oracle depuis peu.
    Merci d'avance.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [MDX] Multiples dates pour une même donnée
    Par Merry29 dans le forum SSAS
    Réponses: 0
    Dernier message: 01/12/2014, 10h20
  2. [XL-2010] Comparaison de dates dans une plage de dates pour rendre visible ou non
    Par PierreXV dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/09/2014, 11h29
  3. [MySQL] Résultat insuffisant pour la différence deux dates avec une requête mysql
    Par onesat dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/08/2014, 13h14
  4. Réponses: 3
    Dernier message: 22/08/2010, 17h40
  5. Réponses: 1
    Dernier message: 27/07/2009, 18h20

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