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 :

Jointure complexe date


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    Par défaut Jointure complexe date
    Bonjour,

    Je souhaiterai réaliser une requête SQL qui me permets de joindre deux fichiers.
    La jointure se faire grâce une colonne qui contient des dates dans chacun des deux fichiers.


    La première régle de gestion qui a été mise en place est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATE_STERILISATION = DATE_UTILISATION -1.


    Cependant je perds de la donnée car parfois la date sterilisation tombe un vendredi, ceci est normal puisque la 1ère regle de gestion qui a été mise en place pour
    joindre ces deux fichier est que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATE_STERILISATION = DATE_UTILISATION -1


    Or le 07/01/17 est un samedi et c'est un jour non travaillé donc il n'est pas renseigné dans mes données.
    Ainsi ce que je souhaiterai faire c'est que lorsque la date de sterilisation tombe un vendredi, je voudrais joindre cette date à la date_utilisation la plus proche
    (c'est à dire au vendredi également de l'autre fichier)

    Exemple:
    Ici la date de sterilisation est le 06/01/2017 (c'est un vendredi) et je souhaiterai relier cette date à la date du fichier A, c'est à dire au 05/01/2017;
    Effectivement si on suit ma regle de gestion que j'ai mis en place je pourrais récuperer la donnée si j'avais le 07/01/17 dans mon fichier A mais vu que c'est un
    jour non travaillé donc cette date ne figure pas.
    Ainsi il faudrait que je relis la colonne date_sterilisation (fichier B) à la date_utilisation la plus proche (fichier A)

    DATE_UTILISATION (fichier A)
    05/01/17

    DATE_STERILISATION (fichier B)
    06/01/17

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Quelque chose dans ce goût-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  tb1.*, tb2.*
    FROM    table_a tb1
        LEFT JOIN
            table_b tb0
            ON  tb0.date_sterilisation = tb1.date_utilisation - 1
        LEFT JOIN
            table_b tb2
            ON  tb2.date_sterilisation = COALESCE(tb0.date_sterilisation, tb1.date_utilisation)
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    Par défaut
    Bonjour al1_24,

    Merci pour la réponse que tu m'as apporté.

    Je ne l'ai pas encore testé, cependant j'avais déjà fais une requête dans le même genre.

    Mais je ne sais pas si ça répond exactement à ce que je souhaite.

    Par exemple si j'ai une date stérilisation qui est le 08/05/2015 (Un lundi), je souhaiterai que la jointure se fasse avec la date utilisation qui est le 0(/05/17 (Un vendredi).

    Actuellement je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     date_sterilisation = date_utilisation -1
    mais dans mon exemple si j'ai une date_sterilisation = 08/05/17 , je ne peux pas utiliser ma règle car ça me renverrai au 07/05/17 (un dimanche, qui est un jour non travaillé) .

    C'est pour cela que lorsque c'est week-end ou un jour férié je souhaiterai faire la jointure sur la date la plus proche qui est travaillée.

    Dans mon exemple donnée, je souhaiterai que date_sterilisation =08/05/17 soit également à date__utilisation =05/05/17 (et non à date_utilisation = 07/05/17)

  4. #4
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 124
    Par défaut
    J'ai surement trouvé une autre solution pour résoudre mon problème ,c'est à dire faire des IF en mettant les règles suivante :

    -Si date_sterilisation = date_utilisation-1 existe alors on la donnée rentre dans la table
    - Si date_sterilisation = date_utilisation-2 existe alors la donnée rentre dans la table
    -Si date_sterilisation = date_utilisation-3 existe alors la donnée rentre dans la table

    A l'heure actuelle le SQL que j'ai mis en place est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT S.DATE_STERILISATION, L.DATE_UTILISATION 
    IF (DATE_STERILISATION = DATE_UTILISATION -1, DATE_UTILISATION,'NULL')
    IF (DATE_STERILISATION = DATE_UTILISATION -2, DATE_UTILISATION,'NULL')
    IF (DATE_STERILISATION = DATE_UTILISATION -3, DATE_UTILISATION,'NULL')
    Ce que je souhaite faire en fait :
    Regarder si la date utilisation-1 existe et dans ce cas là il met mets la date_utilisation, sinon il met null, puis regarder et ainsi de suite.

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Si la règle c'est : Utilisation Mardi à Vendredi => Stérilisation Lundi-Jeudi
    et Utilisation Lundi => Stérilisation Vendredi

    alors il te suffit de gérer le jour (Toujours enlever 1 jour sauf pour le Lundi ou faut enlever 3 jours)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH tutil AS (SELECT TRUNC(SYSDATE, 'MM')-1 + ROWNUM date_util FROM dual connect BY LEVEL < 15),
    tster AS (SELECT TRUNC(SYSDATE, 'MM')-1 + ROWNUM date_steri FROM dual connect BY LEVEL < 15)
    SELECT u.date_util, TO_CHAR(u.date_util, 'D') j, TO_CHAR(u.date_util, 'FMDAY') jour, s.date_steri, TO_CHAR(s.date_steri, 'D') js, TO_CHAR(s.date_steri, 'FMDAY') jourS
    FROM tutil u, tster s
    WHERE s.date_steri = u.date_util - CASE WHEN TO_CHAR(u.date_util, 'D') = '2' THEN 3 ELSE 1 END

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

Discussions similaires

  1. Jointure complexe / intervalle de date
    Par Isildur dans le forum Langage SQL
    Réponses: 14
    Dernier message: 17/12/2011, 03h30
  2. [BO 6.5] Jointure complexe et tables dérivées
    Par tegestobis dans le forum Designer
    Réponses: 9
    Dernier message: 09/01/2008, 14h21
  3. Requête : Jointure Complexe
    Par xwawa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2006, 10h10
  4. [MySQL 4.0.15] Jointure complexe
    Par Carter dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/02/2006, 14h31
  5. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02

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