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 :

Requête SQL Oracle


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 99
    Points : 43
    Points
    43
    Par défaut Requête SQL Oracle
    Bonjour j'ai une base donnée oracle,
    voici la structure de ma table:

    MFT_AR_DETAILR_YRES_ID: Le numéro de la réservation

    MFT_AR_DETAILR_PRIXA: Le prix par jour(chaque réservation peut avoir plusieurs prix pour le même séjour)

    MFT_AR_DETAILR_NUITE:Le nombre de nuit du séjour

    MFT_AR_DETAILR_EXPARRTIME: Date d'arrivée du client

    MFT_AR_DETAILR_EXPDEPTIME: Date de départ de client

    MFT_AR_DETAILR_CURRENT_DATE: la date courante du séjour par exemple si un séjour contient 4 jour qui débute le 05/01/2010 et se termine le 09/01/2010
    cette réservation contient donc 4 lignes et le champs MFT_AR_DETAILR_CURRENT_DATE contient les valeurs suivantes: 05/01/2010, 06/01/2010,07/01/2010 et 08/01/2010,
    Mon problème cé que pour cette réservation si les deux premières nuits sont avec un prix "prix1" et les deux deuxièmes nuits sont avec un autre prix nommé "prix2",
    Le résultat que je veux obtenir c'est que ma requête consiste à retourner 2 lignes chaque ligne contient son propre prix, le nombre de jour(dans se cas chaque ligne contient 2jours) et chaque ligne retourne aussi la date du changement de tarif par exemple:

    MFT_AR_DETAILR_YRES_ID prix: Nbr_jour Du: Au:
    ------------------------ ---- -------- ---------- -----------
    1 50 2 05/01/2010 06/01/2010
    1 60 2 07/01/2010 08/01/2010
    J'ai utilisé plusieurs requêtes et des requête imbriquées mais j'ai pas trouvé de solution, si quelqu'un pourra m'aider j'aurai un grand plaisir
    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,

    Histoire d'être sûr de bien vous comprendre, pourquoi avoir une colonne pour le nombre de nuit du séjour, la date d'arrivée et la date de départ si vous avez une ligne par jour de la reservation? Quelles sont les valeurs qu'elles peuvent prendre?
    Vous pouvez déjà essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    	   MFT_AR_DETAILR_YRES_ID,
    	   MFT_AR_DETAILR_PRIXA AS prix,
    	   count(*) AS Nbr_jours,
    	   min(MFT_AR_DETAILR_CURRENT_DATE) AS Du,
    	   max(MFT_AR_DETAILR_CURRENT_DATE) AS Au
    FROM TableRes
    GROUP BY MFT_AR_DETAILR_YRES_ID, MFT_AR_DETAILR_PRIXA;
    Mais pour reprendre votre exemple, si le prix peut revenir à 50 après être passé à 60, le nombre de jours sera bon, mais l'affichage des dates de début et de fin ne correspondra peut être pas à ce que vous voulez.
    Il faudra regarder du coté des fonctions de fenêtrage pour afficher les plages différentes pour une même réservation et un même prix.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 99
    Points : 43
    Points
    43
    Par défaut
    Le nombre de jour c'est pas le nombre total du séjour mais c'est le nombre de jour par prix, j'ai trouvé une solution pour ça mais comme vous avez dit le problème c'est que ci le prix passe de 50 à 60 puis il revient à 50

  4. #4
    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
    Je ne comprends pas pourquoi des infos comme le nombre de jours figurent dans chaque ligne de vos reservations, ça devrait être reservé à l'affichage ou faire l'objet d'une autre table.

    Pour votre requête, il y a sans doute plus élégant, mais vous pouvez déjà essayer ça et dire si ça correspond à ce que vous voulez obtenir :
    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
     
    SELECT 
           MFT_AR_DETAILR_YRES_ID,
           max(MFT_AR_DETAILR_PRIXA) AS prix,
           count(*) AS Nbr_jours,
           min(MFT_AR_DETAILR_CURRENT_DATE) AS Du,
           max(MFT_AR_DETAILR_CURRENT_DATE) AS Au
    FROM 
    (
        SELECT 
               MFT_AR_DETAILR_YRES_ID,
               MFT_AR_DETAILR_PRIXA,
               MFT_AR_DETAILR_CURRENT_DATE,
               sum(dif) OVER (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE) AS plage
        FROM (
                SELECT 
                       MFT_AR_DETAILR_YRES_ID,
                       MFT_AR_DETAILR_PRIXA,
                       MFT_AR_DETAILR_CURRENT_DATE,
                       coalesce(abs(MFT_AR_DETAILR_PRIXA-lag(MFT_AR_DETAILR_PRIXA) over (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE)),0) AS dif
                FROM TableRes
             )
    )
    GROUP BY MFT_AR_DETAILR_YRES_ID, plage
    ORDER BY MFT_AR_DETAILR_YRES_ID, Du;
    Si ça ne convient pas, il faudra faire un effort sur les explications (au minimum un jeu de données plus complet que ce que vous avez fourni et ce que vous voulez exactement en sortie).

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 99
    Points : 43
    Points
    43
    Par défaut
    Voila une explication:
    Si j'ai un séjour de 5 jour qui commence le 01/01/2010 et se termine le 06/10/2010, dans la table MFT_AR_DETAILR il ya 5 ligne
    - [1] [50] [5 jours] [01/01/2010]
    - [1] [50] [5jours ] [02/01/2010]
    - [1] [50] [5jours ] [03/01/2010]
    - [1] [60] [5jours ] [04/01/2010]
    - [1] [60] [5jours ] [05/01/2010]
    LES CHAMPS DE LA BASE SONT COMME SUIT:
    MFT_AR_DETAILR_YRES_ID: N° de réservation
    MFT_AR_DETAILR_PRIX: Le prix
    MFT_AR_DETAILR_NUITE: Le nombre total des nuits de séjour
    MFT_AR_DETAILR_CURRENT_DATE: la date de chaque jour du séjour
    Le résultat que je veux dans ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Res_ID   Prix    Nbr_jour    Du:              Au:
    ------    ---    --------    --                ---
    [1      ]  [50]   [   3      ] [01/01/2010] [ 03/01/2010]
    [1      ]  [60]   [   2      ] [04/01/2010] [05/01/2010 ]
    J'ai essaye avec cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select distinct(MFT_AR_DETAILR_PRIXA) as prix, 
           Max(MFT_AR_DETAILR_CURRENT_DATE) as maxdate,
           Min(MFT_AR_DETAILR_CURRENT_DATE) as mindate, 
           Max(MFT_AR_DETAILR_CURRENT_DATE)- Min(MFT_AR_DETAILR_CURRENT_DATE) as Nbr_jour,
           MFT_AR_DETAILR_YRES_ID 
               from MFT_AR_DETAILR x 
           where not exists (select * from MFT_AR_DETAILR y 
           where MFT_AR_DETAILR_PRIXA is null 
           and x.MFT_AR_DETAILR_YRES_ID=y.MFT_AR_DETAILR_YRES_ID) 
           group by MFT_AR_DETAILR_PRIXA,MFT_AR_DETAILR_YRES_ID
    et voila un exemple de résultat retourné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PRIX    MAXDATE    MINDATE    NBR_JOUR    MFT_AR_DETAILR_YRES_ID
    Prix    Du:              Au:           Nbr_jour  Res_ID
    ----   ---               ---            -------  ------
    [118]    [15/10/2009] [01/10/2009] [14]    [63486]
    [145]    [30/09/2009] [28/09/2009] [ 2]    [63486]
    cette réservation contient 16 jours comme étant le total de séjour,
    Mais le problème si deux période différentes mais ont avec le même prix
    par exemple le prix passe de 145 vers 118 puis revient 145
    Comment peut-on afficher ces trois periode??

  6. #6
    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
    D'accord, avez vous essayé la requête de mon dernier post?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 99
    Points : 43
    Points
    43
    Par défaut
    oui j'ai essayé et c'est bien marché comme le résultat de ma requête aussis mais pour le cas d'un même prix pour deux période différente??, est ce que votre requête le traite ou non:
    exemple:
    Prix: NBr_jour Du: Au:
    ---------- --------------- ------------ --------
    [118] [3] [01/10/2010] [03/01/2010]
    [145] [2] [04/01/2010] [05/01/2010]
    [118] [2] [06/01/2010] [07/01/2010]

  8. #8
    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
    La dernière oui, et si vous l'aviez essayée vous le sauriez
    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
    SELECT 
           MFT_AR_DETAILR_YRES_ID,
           max(MFT_AR_DETAILR_PRIXA) AS prix,
           count(*) AS Nbr_jours,
           min(MFT_AR_DETAILR_CURRENT_DATE) AS Du,
           max(MFT_AR_DETAILR_CURRENT_DATE) AS Au
    FROM 
    (
        SELECT 
               MFT_AR_DETAILR_YRES_ID,
               MFT_AR_DETAILR_PRIXA,
               MFT_AR_DETAILR_CURRENT_DATE,
               sum(dif) OVER (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE) AS plage
        FROM (
                SELECT 
                       MFT_AR_DETAILR_YRES_ID,
                       MFT_AR_DETAILR_PRIXA,
                       MFT_AR_DETAILR_CURRENT_DATE,
                       coalesce(abs(MFT_AR_DETAILR_PRIXA-lag(MFT_AR_DETAILR_PRIXA) over (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE)),0) AS dif
                FROM MFT_AR_DETAILR
             )
    )
    GROUP BY MFT_AR_DETAILR_YRES_ID, plage
    ORDER BY MFT_AR_DETAILR_YRES_ID, Du;

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 99
    Points : 43
    Points
    43
    Par défaut
    oui j'ai utilisé votre requête
    et je l'ai modifiée aussie:
    Code sql : 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
    SELECT 
           MFT_AR_DETAILR_YRES_ID,
           max(MFT_AR_DETAILR_PRIXA) AS prix,
           count(*) AS Nbr_jours,
           min(MFT_AR_DETAILR_CURRENT_DATE) AS Du,
           max(MFT_AR_DETAILR_CURRENT_DATE) AS Au
    FROM 
    (
        SELECT 
               MFT_AR_DETAILR_YRES_ID,
               MFT_AR_DETAILR_PRIXA,
               MFT_AR_DETAILR_CURRENT_DATE,
               sum(dif) OVER (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE) AS plage
        FROM (
                SELECT 
                       MFT_AR_DETAILR_YRES_ID,
                       MFT_AR_DETAILR_PRIXA,
                       MFT_AR_DETAILR_CURRENT_DATE,
                       coalesce(abs(MFT_AR_DETAILR_PRIXA-lag(MFT_AR_DETAILR_PRIXA) over (PARTITION BY MFT_AR_DETAILR_YRES_ID ORDER BY MFT_AR_DETAILR_CURRENT_DATE)),0) AS dif
                FROM MFT_AR_DETAILR x where not exists (select * from MFT_AR_DETAILR y 
    	        where MFT_AR_DETAILR_PRIXA is null 
    	        and x.MFT_AR_DETAILR_YRES_ID=y.MFT_AR_DETAILR_YRES_ID) 
             )
    )
    GROUP BY MFT_AR_DETAILR_YRES_ID, plage
    ORDER BY MFT_AR_DETAILR_YRES_ID, Du;
    mais malheureusement j'ai pas dans ma table ce cas, merci c'est trés gentil et en reste en contact

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/12/2008, 08h05
  2. Requête SQL Oracle
    Par salsero1 dans le forum Oracle
    Réponses: 3
    Dernier message: 22/04/2008, 13h09
  3. Parametres de requête SQL Oracle
    Par gunbol dans le forum Oracle
    Réponses: 2
    Dernier message: 19/02/2008, 14h31
  4. Tuning requêtes sql oracle
    Par Mehdilis dans le forum Oracle
    Réponses: 2
    Dernier message: 13/06/2007, 13h32
  5. Réponses: 2
    Dernier message: 04/03/2006, 10h47

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