Dit bericht is voor het laatst bewerkt door Miaolinsen op 6-12-2018 om 17:03
Ik heb het niet met MySQL gedaan, ik heb het met mssql gedaan:
/* Geef de tijdsperiode en het aantal te boeken kamers op, vraag naar de hotels, kamertypes en hun gemiddelde prijzen die aan de voorwaarden voldoen (tijd, aantal kamers die nog zijn), en sorteer deze op gemiddelde prijs van laagst naar hoog. De resultaten omvatten hotels, geselecteerde kamercombinaties en hoeveelheden, en de laagste gemiddelde prijs. ##不要求为同一房型, maar het moet hetzelfde hotel zijn, en je kunt het kamertype halverwege veranderen. -- Parsing: Dit betekent dat het kamertype niet hoeft te overwegen, alleen het aantal kamers wordt meegenomen ##比如, selecteer het inchecktijdstip 2018-11-14~2018-11-15, en het aantal geboekte kamers is 5 -- Analyse: Het hotel moet binnen de datumsperiode vallen en er is vraag naar het aantal kamers per dag (als er op een bepaalde dag niemand is, voldoet het niet aan de standaard) ##返回选择酒店A, 11-14 selecteer 4 kamertypes met ID 3, 1 kamertype met ID 2, 11-15 selecteer 3 kamertypen met ID 3, 2 kamertypen met ID 2, en de laagste prijs is 2000 -- Analyse: Bereken de gemiddelde prijs volgens de minimale configuratie per dag ##老师要求只能用sql语句, MySQL-implementatie, kan geen Python, C++, enz. gebruiken. */
-- Binnenkomende parameters, datum, bereik, aantal benodigde kamers VERKLAAR @sdate DATUM = '2018-11-14'; VERKLAAR @edate DATUM = '2018-11-15'; DECLARE @roomnum INT = 5;
-- Bereken het aantal dagen verblijf VERKLAAR @days INT; SET @days = DATEDIFF(DAG, @sdate, @edate)+1;
-- Hotelnummer dat binnen de datumperiode valt, aantal kamers IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_hotel') en type='U') BEGIN Droptafel ##temp_hotel EINDE
SELECTEER ta.hotel_id in ##temp_hotel VAN (SELECT ri. [datum], rt.hotel_id, SUM(ri.remain) room_num VAN room_info ri LINKS SLUIT room_type rt aan op ri.room_id=rt.room_id waarbij @sdate <= [datum] en [datum] <= @edate GROEP DOOR ri. [datum],rt.hotel_id DIE SUM(remain) >= 5) ta heeft GROEPEREN MET ta.hotel_id HEBBEN TELLEN(*) = @days
-- Berekend volgens het hotel (configureer het minimale kamertype per dag)
IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_result') en type='U') BEGIN Droptafel ##temp_result EINDE -- Voorlopige Tabel van Resultaten Hoteldatum Kamertype ID Kamertype Naam Aantal kamers Kamerprijs Hotel Dagelijks totaal hotel Gemiddelde hotelprijs Hotel Totale hotelprijs Hotel Totaal Dagelijkse gemiddelde prijs van hotel Totale dagelijkse kamerprijs MAAK TABEL ##temp_result( hotel_id INT, hotel_name varchar(255), [datum] DATUM, room_id INT, room_name VARCHAR(255), room_num INT, kamerprijs DECIMAAL, dsumprice DECIMAAL, davgprice DECIMAAL, Sumprische DECIMAAL, sumavgpric DECIMAAL
)
VERKLAAR @hid INT; -- Hotel-ID VERKLAAR @infoid INT; -- info-id --bevestig dat de cursor een verzameling is DECLARE my_cursor cursor voor (SELECT hotel_id uit ##temp_hotel); --Open cursor-- Open my_cursor --Start-luscursorvariabelen-- haal de volgende van my_cursor naar @hid terwijl @@FETCH_STATUS = 0 -- de toestand teruggeeft van de laatste cursor uitgevoerd door de FETCH-instructie -- BEGIN -- Op basis van de hotel-ID wordt de terugkerende datum geprijsd IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_room') en type='U') BEGIN Droptafel ##temp_room EINDE
-- Hotels, op datum, met kamers gesorteerd op datum Tarief SELECTEER info_id, [datum], prijs, rest, room_id IN ##temp_room UIT dbo.room_info WAARBIJ @sdate <= [datum] en [datum] <= @edate EN blijft > 0 EN room_id IN (SELECTEER rt.room_id UIT dbo.room_type rt WAAR rt.hotel_id=@hid) BESTEL OP [DATUM] ASC, PRIJS ASC
VERKLAAR @thisrdate DATUM = NUL; -- Date VERKLAAR @thisrnum INT=0; -- Aantal kamers geselecteerd op de huidige datum
VERKLAAR @rdate DATUM = NULL; -- Date DECLARE @rmnum INT = 0; -- Aantal kamers per kamertype
-- Cyclus op datum VERKLAAR @my_cursor2 CURSOR; stel @my_cursor2 = CURSOR VOOR SELECT info_id UIT ##temp_room BESTEL OP [DATUM] ASC, PRIJS ASC OPEN @my_cursor2; HAAL DE VOLGENDE VAN @my_cursor2 NAAR @infoid WHILE(@@FETCH_STATUS=0) BEGIN --##temp_result SELECTEER @rmnum=blijven, @rdate=[datum] VANAF ##temp_room WAAR info_id=@infoid ALS (@thisrdate NULL IS OF @thisrdate != @rdate) BEGIN PRINT @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; EINDE -- Type doseringsformulierselectie IF(@thisrnum <= @roomnum) BEGIN ALS (@thisrnum + @rmnum > @roomnum) BEGIN -- Het aantal kamers dat je moet gebruiken STEL @rmnum = @roomnum-@thisrnum; EINDE EINDE ANDERS BEGIN -- Er is geen kamer nodig voor die datum SET @rmnum = 0; EINDE
ALS (@rmnum > 0) BEGIN -- Resultaten optellen op opgegeven aantal VUL IN ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) SELECTEER @hid, '', @thisrdate, room_id, '', @rmnum, prijs, 0, 0, 0, 0 UIT ##temp_room WAARBIJ info_id = @infoid
-- Het aantal kamers heeft de berekende gemiddelde prijs bereikt STEL @thisrnum = @thisrnum + @rmnum; ALS (@thisrnum = @roomnum) BEGIN -- Totale prijs per hotel, berekend voor data UPDATE ##temp_result STEL dsumprice=(SELECTEER SUM(room_num*roomprice) VAN ##temp_result tr WAAR tr.hotel_id=@hid EN tr.[ datum]=@thisrdate) WAARBIJ hotel_id=@hid EN [datum]=@thisrdate -- Bereken de gemiddelde kamerprijs per hotel, totale prijs per datum UPDATE ##temp_result STEL davgprice=(dsumprice/@roomnum) WAAR hotel_id=@hid EN [date]=@thisrdate EINDE EINDE
HAAL VERVOLGENS VAN @my_cursor2 NAAR @infoid; EINDE dichtbij @my_cursor2; --Zet de cursor uit Dealloc-@my_cursor2; --loslaatcursor
-- Per hotel, bereken de totale hotelprijs UPDATE ##temp_result SET sumpric=(SELECTEER SUM(room_num*roomprice) VAN ##temp_result tr WAAR tr.hotel_id=@hid) WAAR hotel_id=@hid -- Bereken de gemiddelde dagprijs van de totale kamer in het hotel UPDATE ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) WAAR hotel_id=@hid
FETCH vervolgens van my_cursor naar @hid - ga naar de volgende cursor, geen deadloops EINDE sluit my_cursor -- sluit de cursor Loslaten my_cursor - laat de cursor los
-- Voeg de hotelnaam en kamertype toe aan de tijdelijke tabel UPDATE ##temp_result SET hotel_name=(SELECTEER ht.hotel_name VAN dbo.hotel ht WAAR ht.hotel_id=##temp_result.hotel_id), room_name=(SELECTEER rt.room_name UIT dbo.room_type rt WAAR rt.room_id=##temp_result.room_id)
-- Controleer de resultaten in de resultaattabel SELECTEER * UIT ##temp_result
-- Tijdelijke tabellen beëindigen IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_hotel') en type='U') BEGIN Droptafel ##temp_hotel EINDE IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_room') en type='U') BEGIN Droptafel ##temp_room EINDE IF EXISTS(selecteer * uit tempdb.dbo.sysobjects waar id = object_id(N'tempdb.. ##temp_result') en type='U') BEGIN Droptafel ##temp_result EINDE
|