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

PL/SQL Oracle Discussion :

Requete SQL Hotel


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut Requete SQL Hotel
    Bonjour,

    Alors voilà ça fait quelques jours que je me prends la tête sur une requête SQL que je pensais être facile mais qui me pose bien plus de soucis que je ne l'aurais imaginé.

    J'ai donc une une table Reservation contenant (id, id_room, date_reservation, nb_nuits)

    Ce que j'essaie d'obtenir, c'est le nombre de chambre disponibles d'une date donné (donc j'aimerais essayer si c'est possible de créer une variable "date_debut") pour un nombre de nuit donné (et là j'aimerais, si possible encore une fois, créer une autre variable du type "nuits_requises"). Seulement avant même d'essayer de me creuser la tête sur les variables je voulais tester d'obtenir ces résultats en rentrant directement les valeurs et là c'est la cata.. Pas réussi une seule fois a obtenir un résultat logique

    Voici ma dernière tentative SQL en date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT chambre, date_reservation, (date_reservation+nb_nuits) AS fin
    FROM reservation
    WHERE TO_DATE('01/01/12','dd/mm/yy') BETWEEN  date_reservation AND date_reservation+2
    AND date_reservation <
    (SELECT date_reservation
    FROM reservation
    where date_reservation = TO_DATE('01/01/12','dd/mm/yy')+2);
    Donc j'ai mis le "date_debut" en TO_DATE('01/01/12','dd/mm/yy') pour le moment et le nombre de nuits requises en "+2" ..

    Et je n'arrive même pas a trouver la façon logique d'obtenir ce que je veux. Je dois être stupide ou je ne sais pas mais j'espère vraiment que vous saurez m'aider, car là je n'en peux plus..

  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
    La requête suivante te donnera les chambres occupées (et leurs dates d'occupation) sur la période demandée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  chambre
        ,   date_reservation
        ,   date_reservation + nb_nuits AS fin_reservation
    FROM    reservation
    WHERE   TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits
    ;
    Si tu veux connaître les chambres libres, ce sont celles qui ne sont pas dans cette liste.
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    La requête suivante te donnera les chambres occupées (et leurs dates d'occupation) sur la période demandée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  chambre
        ,   date_reservation
        ,   date_reservation + nb_nuits AS fin_reservation
    FROM    reservation
    WHERE   TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits
    ;
    Si tu veux connaître les chambres libres, ce sont celles qui ne sont pas dans cette liste.
    Et comment je pourrais faire pour obtenir celles qui ne sont pas dans la liste ? J'ai essayé avec un "NOT BETWEEN" et de mettre une date maximum mais je n'y arrive pas..


    Citation Envoyé par alx13 Voir le message
    Salut,

    si j'ai bien compris on peut formuler autrement
    tu veux les chambres qui n'ont pas de réservation à une date donnée.

    Tu dois avoir une table chambre non?
    si oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  chambre
    FROM    Tchambre
    where not exists (SELECT  chambre
                            FROM    reservation
                            WHERE   TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation 
                           AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits)

    al1_24 a été plus rapide


    J'ai essayé ta façon et ça ne me retourne absolument aucun résultat

    Désolé j'ai vraiment l'air d'un assisté.. En tout cas merci beaucoup pour votre aide !

    EDIT :

    Bon, j'ai finalement réussi, je me sens vraiment stupide je suis resté bloqué sur des erreurs grossières et logiques mais mon cerveau n'a pas voulu capter ! Voici donc mon code final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  num_chambre
    FROM    chambre
    WHERE num_chambre NOT IN
    (SELECT chambre
    FROM reservation
    WHERE  TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') - 1 + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits)
    ORDER BY num_chambre;
    Après ça concerne la 2eme partie du problème, les variables.

    Donc j'ai voulu tenter avec un "Run script", ça m'a mis des erreurs comme quoi variables non déclaré. Donc j'ai fais des recherches, tenter maintes choses mais impossible de trouver quelque chose de fonctionnel,
    Voilà mon code actuel :

    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
    set output on;
    DECLARE
    debut varchar2(20);
    duree number;
     
    BEGIN
    debut := '&debut';
    duree := '&duree';
     
    SELECT  num_chambre
    FROM    chambre
    WHERE num_chambre NOT IN
    (SELECT chambre
    FROM reservation
    WHERE  TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') - 1 + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits)
    ORDER BY num_chambre;
    END;
    Et cette erreur s'affiche :
    ORA-06550: line 9, column 1:
    PLS-00428: an INTO clause is expected in this SELECT statement
    Mais je ne vois pas comment je pourrais utiliser un INTO..

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Salut,

    Ben tu es dans un block pl/sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Begin
    ......
    end;
    Donc il faut que tu fasses un select into ou dans ton cas un cursor dans ta partie declare puis tu l’appelles dans ton begin end.

    Ou alors tu ne t’embêtes pas

    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
    29
    30
    31
    32
    33
    34
    35
     
    SET output ON;
    VAR debut varchar2(20);
    VAR duree number;
    BEGIN
    	debut := '&1';
    	duree := '&2';
    END;
    / 
     
    DEFINE pv_out_path = 'MONCHEMIN';
    DEFINE pv_out_file = 'MONFICHIERDESORTIE';
     
    SPOOL &pv_out_path/&pv_out_file
    SET COLSEP     "&9"
     
    --- pour pouvoir imprimer
    SET HEAD       OFF  
    SET FEEDBACK   OFF
    SET ECHO       OFF
    SET VERIFY     OFF
    SET LINESIZE   180
     
    SELECT  num_chambre
    FROM    chambre
    WHERE num_chambre NOT IN
    (SELECT chambre
    FROM reservation
    WHERE  TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') - 1 + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits)
    ORDER BY num_chambre;
     
    SPOOL OFF
     
    EXIT
    C'est sommaire mais tu devrais avoir ton résultat dans ton fichier

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    J'ai donc tenté, j'ai en ce moment le code exact que tu m'as donné et j'ai cette erreur :

    Error report:
    ORA-06550: line 2, column 9:
    PLS-00201: identifier 'DEBUT' must be declared
    ORA-06550: line 2, column 9:
    PL/SQL: Statement ignored
    ORA-06550: line 3, column 9:
    PLS-00201: identifier 'DUREE' must be declared
    ORA-06550: line 3, column 9:
    PL/SQL: Statement ignored
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:
    Et comment je pourrais utiliser un CURSOR ? j'essaie mais je n'arrive même pas a un résultat proche de la réussite..

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    heu ton "Run script"

    tu parles bien d'un script sql que tu lances sous sqlplus en faisant par exemple:
    @monscript.sql parm1 parm2

    sous windows?

    au plus simple :

    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
     
    SET HEAD       OFF  
    SET FEEDBACK   OFF
    SET ECHO       OFF
    SET VERIFY     OFF
    SET LINESIZE   180
     
    SPOOL c:\monfichier.log
     
    DEFINE debut = '07.11.2013';
    DEFINE duree = 2;
     
    --DEFINE debut = &1;
    --DEFINE duree = &2;
     
    SELECT  num_chambre
    FROM    chambre
    WHERE num_chambre NOT IN
    (SELECT chambre
    FROM reservation
    WHERE  TO_DATE('&debut','dd/mm/yy')  BETWEEN  date_reservation AND date_reservation + nb_nuits
        OR  TO_DATE('&debut','dd/mm/yy') - 1 + &duree BETWEEN  date_reservation AND date_reservation + nb_nuits)
    ORDER BY num_chambre;
     
    SPOOL OFF

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Salut,

    si j'ai bien compris on peut formuler autrement
    tu veux les chambres qui n'ont pas de réservation à une date donnée.

    Tu dois avoir une table chambre non?
    si oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  chambre
    FROM    Tchambre
    where not exists (SELECT  chambre
                            FROM    reservation
                            WHERE   TO_DATE(:debut,'dd/mm/yy')  BETWEEN  date_reservation 
                           AND date_reservation + nb_nuits
        OR  TO_DATE(:debut,'dd/mm/yy') + :duree BETWEEN  date_reservation AND date_reservation + nb_nuits)

    al1_24 a été plus rapide

Discussions similaires

  1. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  2. Prob de requete sql et variable
    Par agent-zaizai dans le forum ASP
    Réponses: 11
    Dernier message: 21/10/2003, 16h54
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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