Šo ziņu pēdējo reizi rediģēja Miaolinsen 2018-12-6 17:03
Es to nedarīju ar mysql, es to darīju ar mssql:
/* Norādiet rezervējamo numuru laika diapazonu un skaitu, vaicājiet viesnīcas, numuru veidu izvēli un to vidējās cenas, kas atbilst nosacījumiem (laiks, atlikušo numuru skaits), un kārtojiet tās pēc vidējās cenas no zemākās uz augstāko. Rezultāti ietver viesnīcas, izvēlētās numuru kombinācijas un daudzumus, kā arī zemāko vidējo cenu. ##不要求为同一房型, bet tai jābūt tai pašai viesnīcai, un jūs varat mainīt numura veidu vidū. -- Parsēšana: Tas nozīmē, ka nav jāņem vērā telpas tips, tiek ņemts vērā tikai istabu skaits ##比如, izvēlieties reģistrēšanās laiku 2018-11-14~2018-11-15, un rezervēto numuru skaits ir 5 -- Analīze: Viesnīcai jābūt datumu diapazonā, un katru dienu ir pieprasījums pēc numuru skaita (ja noteiktā dienā nav neviena, tas neatbildīs standartam) ##返回选择酒店A, 11-14 izvēlieties 4 numuru tipus ar ID 3, 1 numuru tipu ar ID 2, 11-15 izvēlieties 3 numuru tipus ar ID 3, 2 numuru tipus ar ID 2, un zemākā cena ir 2000 -- Analīze: Aprēķiniet vidējo cenu atbilstoši minimālajai konfigurācijai dienā ##老师要求只能用sql语句, MySQL ieviešana, nevar izmantot Python, C++ utt. */
-- Ienākošie parametri datumu diapazons, nepieciešamo numuru skaits DEKLARĒT @sdate DATUMU = '2018-11-14'; DEKLARĒT @edate DATUMU = '2018-11-15'; DEKLARĒJIET @roomnum INT = 5;
-- Aprēķināt uzturēšanās dienu skaitu DEKLARĒT @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Viesnīcas numurs, kas atbilst datumu diapazonam, numuru skaits IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') un type='U') SĀKT Nomest tabulu ##temp_hotel BEIGAS
ATLASIET ta.hotel_id ##temp_hotel NO (SELECT ri. [datums], rt.hotel_id, SUM(ri.remain) room_num FROM room_info ri LEFT JOIN room_type rt uz ri.room_id=rt.room_id kur @sdate <= [datums] un [datums] <= @edate GROUP BY ri. [datums],rt.hotel_id KAM SUM(paliek) >= 5) ta GRUPĒT PĒC ta.hotel_id, KAM COUNT(*) = @days
-- Aprēķināts atbilstoši viesnīcai (konfigurēt minimālo numura veidu dienā)
IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') un type='U') SĀKT Nomest tabulu ##temp_result BEIGAS -- Provizoriska rezultātu tabula Viesnīcas datums Numura veids ID Numura veids Nosaukums Numuru skaits Numura cena Viesnīca Dienas Kopā Viesnīca Dienas vidējā viesnīcas cena Viesnīca Kopējā viesnīcas cena Kopējā dienas cena Viesnīca Kopējā dienas numura cena IZVEIDOT TABULU ##temp_result( hotel_id INT, hotel_name varchar(255), [datums] DATUMS, room_id INT, room_name VARČARS (255), room_num INT, istabas cena DECIMĀLDAĻĀ, dsumprice DECIMĀLDAĻĀ, davgprice DECIMAL, sumpric DECIMAL, sumavgpric DECIMAL
)
DEKLARĒT @hid INT; -- Viesnīcas ID DEKLARĒT @infoid INT; -- Info ID --apstipriniet, ka kursors ir kolekcija DECLARE my_cursor kursoru (SELECT hotel_id no ##temp_hotel); --Atvērt kursoru-- Atvērt my_cursor --Start Loop kursora mainīgie-- Nākamā no my_cursor uz @hid kamēr @@FETCH_STATUS = 0 -- atgriež pēdējā kursora stāvokli, ko izpilda FETCH priekšraksts -- SĀKT -- Pamatojoties uz viesnīcas ID, tiek noteikta periodiskā datuma cena IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') un type='U') SĀKT nomest tabulu ##temp_room BEIGAS
-- Viesnīcas, pēc datuma, ar numuriem, kas sakārtoti pēc datuma Cena SELECT info_id, [date], price, remain, room_id INTO ##temp_room FROM dbo.room_info WHERE @sdate <= [date] un [date] <= @edate UN PALIEK > 0 UN room_id (ATLASIET rt.room_id NO dbo.room_type rt KUR rt.hotel_id=@hid) PASŪTĪJUMS LĪDZ [datums] ASC, cena ASC
DEKLARĒT @thisrdate DATUMU = NULL; -- Datums DEKLARĒJIET @thisrnum INT=0; -- Pašreizējā datumā izvēlēto istabu skaits
DEKLARĒT @rdate DATUMU = NULL; -- Datums DEKLARĒJIET @rmnum INT = 0; -- Numuru skaits pēc numura veida
-- Cikls pēc datuma PASLUDINĀT @my_cursor2 KURSORU; set @my_cursor2 = KURSORS ATLASĪT info_id NO ##temp_room ORDER BY [datums] ASC, cena ASC ATVĒRTS @my_cursor2; NĀKAMĀ IEGŪŠANA NO @my_cursor2 UZ @infoid WHILE(@@FETCH_STATUS=0) SĀKT --##temp_result SELECT @rmnum=palikt, @rdate=[datums] NO ##temp_room KUR info_id=@infoid JA (@thisrdate IR NULLE VAI @thisrdate != @rdate) SĀKT DRUKĀT @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; BEIGAS -- Zāļu formas izvēle telpas tips IF(@thisrnum <= @roomnum) SĀKT IF (@thisrnum + @rmnum > @roomnum) SĀKT -- Izmantojamo istabu skaits SET @rmnum = @roomnum-@thisrnum; BEIGAS BEIGAS CITĀDI SĀKT -- Šim datumam nav nepieciešama vieta IESTATIET @rmnum = 0; BEIGAS
JA (@rmnum > 0) SĀKT -- Pievienojiet rezultātus pēc norādītā skaita IEVIETOT ##temp_result(hotel_id, hotel_name, [datums], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) ATLASIET @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 NO ##temp_room KUR info_id = @infoid
-- Numuru skaits sasniedzis aprēķināto vidējo cenu SET @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) SĀKT -- Kopējā cena pa viesnīcām, aprēķināta datumiem UPDATE ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid UN tr.[ datums]=@thisrdate) KUR hotel_id=@hid UN [datums]=@thisrdate -- Aprēķināt vidējo numura cenu pa viesnīcām, kopējo cenu pēc datuma UPDATE ##temp_result SET davgprice=(dsumprice/@roomnum) KUR hotel_id=@hid UN [datums]=@thisrdate BEIGAS BEIGAS
NĀKAMĀ NO @my_cursor2 UZ @infoid; BEIGAS tuvu @my_cursor2; --Izslēdziet kursoru dedalēt @my_cursor2; --atbrīvot kursoru
-- Pēc viesnīcas aprēķiniet kopējo viesnīcas cenu UPDATE ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid) WHERE hotel_id=@hid -- Aprēķināt kopējā numura vidējo dienas cenu viesnīcā ATJAUNINĀT ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) KUR hotel_id=@hid
FETCH Next no my_cursor uz @hid - pāriet uz nākamo kursoru, bez strupceļa BEIGAS aizvērt my_cursor -- aizvērt kursoru Atcelt my_cursor - atlaidiet kursoru
-- Pievienojiet viesnīcas nosaukumu un numura tipa nosaukumu pagaidu tabulai ATJAUNINIET ##temp_result IESTATIET hotel_name=(ATLASIET ht.hotel_name NO dbo.hotel ht KUR ht.hotel_id=##temp_result.hotel_id), room_name=(ATLASIET rt.room_name NO dbo.room_type rt KUR rt.room_id=##temp_result.room_id)
-- Pārbaudiet rezultātus no rezultātu tabulas IZVĒLIETIES * NO ##temp_result
-- Izbeigt pagaidu tabulu notīrīšanu IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') un type='U') SĀKT Nomest tabulu ##temp_hotel BEIGAS IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') un type='U') SĀKT nomest tabulu ##temp_room BEIGAS IF EXISTS(atlasiet * no tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') un type='U') SĀKT Nomest tabulu ##temp_result BEIGAS
|