Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 23250|Répondre: 11

[Nouveau numéro] Comment choisir les chambres les moins chères

[Copié le lien]
Publié sur 05/12/2018 21:32:38 | | | |
Il y a maintenant deux tables à utiliser, room_type et room_info
Il y a 3 hôtels avec des cartes d’identité 1~3. Chaque hôtel a alors 3 types de chambres, avec des identifiants de 1~9 respectivement.
Le room_type contient le nom, l’ID et l’identifiant d’hôtel correspondant de chaque type de chambre
Ce qui est stocké dans le room_info est le prix de chaque jour, chaque type de chambre et le nombre de chambres restantes.
Les sujets que j’aimerais poser sont :
Spécifiez la plage horaire et le nombre de chambres à réserver, interrogez les hôtels, les choix de types de chambres et leurs prix moyens correspondant aux conditions (heure, nombre de chambres restantes), puis triez-les par prix moyen du plus bas au plus élevé. Les résultats incluent les hôtels, les combinaisons et quantités de chambres sélectionnées, ainsi que le prix moyen le plus bas.
##不要求为同一房型, mais ça doit être le même hôtel, et tu peux changer le type de chambre en cours de route.
##比如, l’heure d’enregistrement est le 2018-11-14~2018-11-15, et le nombre de chambres réservées est de 5
##返回选择酒店A, 11-14 sélectionnent 4 types de chambres avec ID 3, 1 type de chambre avec ID 2, 11-15 types de chambres avec ID 3, 2 types de chambres avec ID 2, et le prix le plus bas est 2000
##老师要求只能用sql语句, l’implémentation MySQL ne peut pas utiliser Python, C++, etc
Je ne l’ai pas écrit pendant une journée, et je n’ai pas vu de sujet similaire sur Internet, alors je suis venu demander de l’aide aux dieux, et je veux te demander comment y parvenir, merci~







Précédent:Le partage d’expériences auto-rapporté par le singe du programme PHP
Prochain:Politique pour l’examen d’entrée postuniversitaire 2019 Matériel de sprint de Xu Tao et Xiao Xiurong
Publié sur 06/12/2018 17:00:58 |
Ce post a été modifié pour la dernière fois par Miaolinsen le 6-12-2018 à 17:03

Je ne l’ai pas fait avec mysql, je l’ai fait avec mssql :


/*
Spécifiez la plage horaire et le nombre de chambres à réserver, interrogez les hôtels, les choix de types de chambres et leurs prix moyens correspondant aux conditions (heure, nombre de chambres restantes), puis triez-les par prix moyen du plus bas au plus élevé. Les résultats incluent les hôtels, les combinaisons et quantités de chambres sélectionnées, ainsi que le prix moyen le plus bas.
##不要求为同一房型, mais ça doit être le même hôtel, et tu peux changer le type de chambre en cours de route. -- Analyse syntaxique : Cela signifie qu’il n’est pas nécessaire de prendre en compte le type de pièce, seul le nombre de pièces est pris en compte
##比如, sélectionnez l’heure d’enregistrement 2018-11-14~2018-11-15, et le nombre de chambres réservées est de 5 -- Analyse : L’hôtel doit être dans la plage de dates, et il y a une demande pour le nombre de chambres chaque jour (s’il n’y en a personne un jour donné, il ne répondra pas à la norme)
##返回选择酒店A, 11-14 sélectionnent 4 types de pièces avec ID 3, 1 type de chambre avec ID 2, 11-15 sélectionnent 3 types de pièces avec ID 3, 2 types de chambres avec ID 2, et le prix le plus bas est 2000 -- Analyse : Calculer le prix moyen selon la configuration minimale par jour
##老师要求只能用sql语句, mysql, impossible d’utiliser python, c++, etc. */


-- Paramètres entrants, plage de dates, nombre de pièces requises
DÉCLARER @sdate DATE = '2018-11-14' ;
DÉCLARER @edate DATE = '2018-11-15' ;
DÉCLARER @roomnum INT = 5 ;


-- Calculer le nombre de jours de séjour
DÉCLARER @days INT ;
SET @days = DATEDIFF(DAY, @sdate, @edate)+1 ;

-- Numéro d’hôtel correspondant à la plage de dates, nombre de chambres
IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_hotel') et type='U')
DÉBUT
    Tableau de dépôt ##temp_hotel
FIN

SÉLECTIONNEZ ta.hotel_id dans ##temp_hotel DEPUIS
(SELECT ri. [date], rt.hotel_id, SUM(ri.remain) room_num FROM room_info ri LEFT JOIN room_type rt sur ri.room_id=rt.room_id où @sdate <= [date] et [date] <= @edate GROUPE PAR ri. [date],rt.hotel_id AYANT SUM(remain) >= 5) ta
GROUPE PAR ta.hotel_id AYANT COUNT(*) = @days



-- Calculé selon l’hôtel (définir le type minimum de chambre par jour)

IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_result') et type='U')
DÉBUT
    tableau de débarquement ##temp_result
FIN
-- Tableau provisoire des résultats Hôtel Date Type de chambre ID Type de chambre Nom de chambre Nombre de chambres Prix de chambre Hôtel Jour Total d’hôtel Prix moyen quotidien d’hôtel Prix total d’hôtel Prix total de l’hôtel Prix moyen quotidien total de l’hôtel
CRÉER TABLEAU ##temp_result(
    hotel_id INT,
    hotel_name varchar (255),
    [date] DATE,
    room_id INT,
    room_name VARCHAR (255),
    room_num INT,
    prix de la chambre DÉCIMAL,
    dsumprice DECIMAL,
    davgprice DECIMAL,
    DÉCIMAL de sumpric,
    DÉCIMAL SUMAVGPRIC
)

DÉCLAREZ @hid INT ; -- Carte d’hôtel
DÉCLAREZ @infoid INT ; -- Info ID
--affirmer que le curseur est une collection
DÉCLARE my_cursor curseur pour (SELECT hotel_id depuis ##temp_hotel) ;
--Curseur ouvert--
Ouvert my_cursor
--Variables de curseur de boucle de démarrage--
Va chercher ensuite de my_cursor dans @hid
tandis que @@FETCH_STATUS = 0 -- renvoie l’état du dernier curseur exécuté par l’instruction FETCH --
DÉBUT      
    -- D’après l’identifiant de l’hôtel, la date récurrente est tarifée
    IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_room') et type='U')
    DÉBUT
        table de dépôt ##temp_room
    FIN

    -- Hôtels, par date, avec les chambres triées par date Tarif
    SÉLECTIONNEZ info_id, [date], price, remain, room_id DANS ##temp_room DEPUIS dbo.room_info OÙ @sdate <= [date] et [date] <= @edate ET restez > 0 ET room_id DANS (SÉLECTIONNEZ rt.room_id PARMI dbo.room_type rt OÙ rt.hotel_id=@hid) COMMANDE PAR [date] ASC, prix ASC
   
   
    DÉCLARER @thisrdate DATE = NULLE ; -- Date
    DÉCLARER @thisrnum INTR=0 ; -- Nombre de chambres sélectionnées à la date actuelle
   
    DÉCLARER @rdate DATE = NULLE ; -- Date
    DÉCLARER @rmnum INT = 0 ; -- Nombre de chambres par type de chambre
   
    -- Cycle par date
    DÉCLARER @my_cursor2 CURSEUR ;
    DÉFINISSEZ @my_cursor2 = CURSEUR POUR SÉLECTIONNER info_id DEPUIS ##temp_room ORDRE PAR [DATE] ASC, PRIX ASC
    OUVRE @my_cursor2 ;
    VA CHERCHER ENSUITE DE @my_cursor2 DANS @infoid
    WHILE(@@FETCH_STATUS=0)
    DÉBUT
        --##temp_result
        SELECT @rmnum=remain, @rdate=[date] DEPUIS ##temp_room OÙ info_id=@infoid
        SI (@thisrdate EST NUL OU @thisrdate != @rdate)
        DÉBUT
            IMPRESSION @rdate
            ENSEMBLE @thisrdate = @rdate ;
            ENSEMBLE @thisrnum = 0 ;
        FIN
        -- Type de salle de sélection de la forme posologique
        SI(@thisrnum <= @roomnum)
        DÉBUT
            SI (@thisrnum + @rmnum > @roomnum)
            DÉBUT
                -- Le nombre de pièces que vous devez utiliser
                ENSEMBLE @rmnum = @roomnum-@thisrnum ;
            FIN
        FIN
        SINON   
        DÉBUT
            -- Aucune chambre n’est requise pour cette date
            ENSEMBLE @rmnum = 0 ;
        FIN
        
        SI (@rmnum > 0)
        DÉBUT
            -- Ajouter les résultats par nombre spécifié
            INSÉRER DANS ##temp_result(hotel_id, hotel_name, [date], room_id, room_name, room_num, prix de la chambre, prix de la pièce, prix de la chute, sumpric, sumavgpric)
            SÉLECTIONNEZ @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DEPUIS ##temp_room OÙ info_id = @infoid
            
            -- Le nombre de chambres a atteint le prix moyen calculé
            L’ENSEMBLE @thisrnum = @thisrnum + @rmnum ;
            SI (@thisrnum = @roomnum)
            DÉBUT
                -- Prix total par hôtel, calculé pour les dates
                MISE À JOUR ##temp_result DÉFINISSEZ dsumprice=(SELECT SUM(room_num*roomprice) DEPUIS ##temp_result TR OÙ tr.hotel_id=@hid ET tr.[ date]=@thisrdate) OÙ hotel_id=@hid ET [date]=@thisrdate
                -- Calculer le tarif moyen des chambres par hôtel, prix total par date
                MISE À JOUR ##temp_result SET davgprice=(dsumprice/@roomnum) OÙ hotel_id=@hid ET [date]=@thisrdate
            FIN
        FIN

        ALLER CHERCHER ENSUITE DE @my_cursor2 DANS @infoid ;
    FIN   
    @my_cursor2 fermé ;  --Désactivez le curseur
    délocat @my_cursor2 ;   --relâcher le curseur

    -- Par hôtel, calculer le prix total de l’hôtel
    MISE À JOUR ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid) WHERE hotel_id=@hid
    -- Calculer le prix moyen quotidien du total des chambres de l’hôtel
    MISE À JOUR ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) OÙ hotel_id=@hid

    ATTCH next de my_cursor vers @hid - passe au curseur suivant, pas de boucles mortes
FIN  
Fermer my_cursor -- Fermer le curseur
Deallocate my_cursor - Relâcher le curseur


-- Ajouter le nom de l’hôtel et le nom du type de chambre sur le tableau temporaire
MISE À JOUR ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht WHERE ht.hotel_id=##temp_result.hotel_id),
room_name=(SELECT rt.room_name FROM dbo.room_type rt WHERE rt.room_id=##temp_result.room_id)


-- Vérifiez les résultats dans le tableau des résultats
SÉLECTIONNER * DEPUIS ##temp_result




-- Fin du débarrassage des tables temporaires
IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_hotel') et type='U')
DÉBUT
    Tableau de dépôt ##temp_hotel
FIN
IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_room') et type='U')
DÉBUT
    table de dépôt ##temp_room
FIN
IF EXISTS(select * from tempdb.dbo.sysobjects où id = object_id(N’tempdb.. ##temp_result') et type='U')
DÉBUT
    tableau de débarquement ##temp_result
FIN

Score

Nombre de participants1MO+1 contribuer+1 Effondrement raison
Admin + 1 + 1 Enthousiaste à l’idée d’aider les autres !

Voir toutes les notes

 Propriétaire| Publié sur 06/12/2018 14:11:48 |
xzxmustwin Publié le 6-12-2018 11:58
Pour être honnête, la structure de ce tableau est un peu déraisonnable

Les questions de devoirs assignées par le professeur de la base de données EMMMM peuvent effectivement être déraisonnables, et je ne les ai pas vues si je ne les apprenais pas très bien...
Cependant, la clé reste les idées de résolution de problèmes, je voudrais demander à mes amis si vous avez des suggestions ?
 Propriétaire| Publié sur 06/12/2018 14:09:20 |
lzzsf publié le 6-12-2018 à 09:07
mySQL est obsolète, pas de client, donnez-moi le script pour SQL Server

Désolé, je n’ai pas encore utilisé SQL Server, peut-être parce que c’est juste de l’enseignement, donc le professeur nous a demandé d’utiliser mysql pour le faire. Si vos amis sont prêts à partager leurs idées, merci beaucoup.
Publié sur 05/12/2018 21:57:13 |
Je vais aller au groupe QQ pour offrir une récompense de 10 yuans afin de voir si quelqu’un peut t’aider à répondre non
Publié sur 06/12/2018 07:56:39 |
Aide
Publié sur 06/12/2018 09:07:08 |
mySQL est obsolète, pas de client, donnez-moi le script pour SQL Server

Score

Nombre de participants1MO+1 contribuer+1 Effondrement raison
Admin + 1 + 1 Enthousiaste !

Voir toutes les notes

Publié sur 06/12/2018 11:24:25 |
lzzsf publié le 6-12-2018 à 09:07
mySQL est obsolète, pas de client, donnez-moi le script pour SQL Server

Il est recommandé de discuter de l’idée et de laisser le propriétaire l’utiliser comme référence, ce qui devrait aussi être possible
Publié sur 06/12/2018 11:58:37 |
Pour être honnête, la structure de ce tableau est un peu déraisonnable

Score

Nombre de participants1MO+1 contribuer+1 Effondrement raison
Admin + 1 + 1 Enthousiaste !

Voir toutes les notes

 Propriétaire| Publié sur 06/12/2018 14:07:29 |
Publié le 5-12-2018 à 21:57
Je vais aller au groupe QQ pour offrir une récompense de 10 yuans afin de voir si quelqu’un peut t’aider à répondre non

Merci, si quelqu’un veut répondre, je vous enverrai l’enveloppe rouge :)
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com