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
Bon il y a plus de valeurs code en réalité...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
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é).
Si il y a une âme charitable pour me donner des pistes et m'éclairer je lui en serais reconnaissant.
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' )))
Merci
Partager