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
|