Seda postitust toimetas viimati Miaolinsen 2018-12-6 kell 17:03
Ma ei teinud seda mysql-iga, vaid mssql-iga:
/* Määra broneeritavate ruumide ajavahemik ja arv, küsi hotellidest, toatüübi valikutest ja nende keskmistest hindadest, mis vastavad tingimustele (aeg, järelejäänud tubade arv), ning sorteeri need keskmise hinna järgi madalaimast kõrgeimani. Tulemused hõlmavad hotelle, valitud toakombinatsioone ja koguseid ning madalaimat keskmist hinda. ##不要求为同一房型, aga see peab olema sama hotell ja toa tüüp saab poole peal vahetada. -- Tõlgendamine: See tähendab, et ruumitüübi pole vaja arvestada, arvestatakse ainult ruumide arvu ##比如, vali registreerimisaeg 2018-11-14~2018-11-15, ja broneeritud tubade arv on 5 – Analüüs: Hotell peab olema kuupäevavahemikus ning iga päev on nõudlus tubade arvu järele (kui kindlal päeval kedagi pole, ei vasta see standardile) ##返回选择酒店A, 11-14 vali 4 toatüüpi ID 3-ga, 1 toatüüp ID 2-ga, 11-15 vali 3 toatüüpi ID 3-ga, 2 toatüüpi ID 2-ga ja madalaim hind on 2000 -- Analüüs: arvuta keskmine hind vastavalt minimaalsele konfiguratsioonile päevas ##老师要求只能用sql语句, MySQL rakendus, ei saa kasutada Pythonit, C++ jne. */
-- Saabuvad parameetrid, kuupäevavahemik, vajalike tubade arv DEKLAREERI @sdate KUUPÄEV = '2018-11-14'; DEKLAREERI @edate KUUPÄEV = '2018-11-15'; DEKLAREERI @roomnum INT = 5;
-- Arvuta viibimispäevade arv DEKLAREERI @days INT; KOMPLEKT @days = DATEDIFF(PÄEV, @sdate, @edate)+1;
-- Hotelli number, mis vastab kuupäevavahemikule, tubade arv IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_hotel') ja type='U') ALUSTA Langeta laud ##temp_hotel LÕPP
VALI ta.hotel_id ##temp_hotel VALIKUST (VALI ri. [date], rt.hotel_id, SUM(ri.remain) room_num room_info ri VASAKULT ÜHINEVAD room_type rt ri.room_id=rt.room_id KUS @sdate <= [date] ja [date] <= @edate GRUPP RI JÄRGI. [date],rt.hotel_id HAVING SUM(REMAIN) >= 5) ta GRUPEERI ta.hotel_id ARVU(*) = @days
-- Arvutatud vastavalt hotellile (seadista miinimumtoatüüp päevas)
IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_result') ja type='U') ALUSTA Drop table ##temp_result LÕPP -- Esialgne tulemuste tabel Hotelli kuupäev Toa tüüp ID Toa tüüp Nimi Tubade arv Toa hind Hotell Päev Kokku hotell Iga päev Keskmine hotelli hind Hotell Kogu hotelli hind Hotell Kokku Päevane Keskmine Hotelli Keskmine Hind Kokku Päevane Toa Hind LOO TABEL ##temp_result( hotel_id INT, hotel_name Varchar(255), [kuupäev] DATE, room_id INT, room_name VARCHAR(255), room_num INT, toa hind KÜMNENDKOHTA, dsumprice DECIMAL, davgprice DECIMAL, sumpric DECIMAL, sumavgpric DECIMAL
)
DEKLAREERIDA @hid INT; -- Hotelli ID DEKLAREERI @infoid INT; -- info ID --kinnitada, et kursor on kogumik DECLARE my_cursor kursor (SELECT hotel_id ##temp_hotel-st); --Ava kursor-- Ava my_cursor --Käivitustsükli kursori muutujad-- Too järgmine my_cursor @hid samal ajal kui @@FETCH_STATUS = 0 -- tagastab viimase FETCH lausega täidetud kursori oleku -- ALUSTA -- Hotelli ID põhjal on korduv kuupäev hinnastatud IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_room') ja type='U') ALUSTA Langeta laud ##temp_room LÕPP
-- Hotellid kuupäeva järgi, toad kuupäeva järgi Hind VALI info_id, [kuupäev], hind, jää, room_id VALI ##temp_room SEALT dbo.room_info KUS @sdate <= [kuupäev] ja [kuupäev] <= @edate JA jää > 0 JA room_id SISSE (VALI rt.room_id dbo.room_type rt KUS rt.hotel_id=@hid) ORDER BY [kuupäev] ASC, hind ASC
DEKLAREERI @thisrdate KUUPÄEV = NULL; -- Kuupäev DEKLAREERI @thisrnum INT=0; -- Valitud tubade arv praegusel kuupäeval
DEKLAREERI @rdate KUUPÄEV = NULL; -- Kuupäev DEKLAREERI @rmnum INT = 0; -- Ruumide arv ruumitüübi järgi
-- Tsükkel kuupäeva järgi DEKLAREERI @my_cursor2 KURSOR; Sea @my_cursor2 = KURSOR SELECT info_id HULGAST ##temp_room TELLI JÄRGI [kuupäev] ASC, hind ASC AVA @my_cursor2; TOO JÄRGMINE @my_cursor2 SISSE @infoid WHILE(@@FETCH_STATUS=0) ALUSTA --##temp_result VALI @rmnum=jäämine, @rdate=[kuupäev] ALATES ##temp_room KUS info_id=@infoid KUI (@thisrdate ON NULL VÕI @thisrdate != @rdate) ALUSTA TRÜKI @rdate SET @thisrdate = @rdate; KOMPLEKT @thisrnum = 0; LÕPP -- Annusvormi valikuruumi tüüp IF(@thisrnum <= @roomnum) ALUSTA IF (@thisrnum + @rmnum > @roomnum) ALUSTA -- Ruumide arv, mida pead kasutama KOMPLEKT @rmnum = @roomnum-@thisrnum; LÕPP LÕPP OTHER ALUSTA -- Selleks kuupäevaks ruumi pole vaja KOMPLEKT @rmnum = 0; LÕPP
IF (@rmnum > 0) ALUSTA -- Lisa tulemused määratud arvuga SISESTA ##temp_result(hotel_id, hotel_name, [kuupäev], room_id, room_name, room_num, toahind, dsumprice, davgprice, sumpric, sumavgpric) VALI @hid, '', @thisrdate, room_id, '', @rmnum, hind, 0, 0, 0, 0 ###temp_room KUS info_id = @infoid
-- Tubade arv on jõudnud arvutatud keskmise hinnani SET @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) ALUSTA -- Koguhind hotellide kaupa, arvutatud kuupäevade kaupa UUENDUS ##temp_result SEA dsumprice=(SELECT SUM(room_num*toahind) ALATES ##temp_result TR, KUS tr.hotel_id=@hid JA TR.[ date]=@thisrdate) KUS hotel_id=@hid JA [kuupäev]=@thisrdate -- Arvuta keskmine toahind hotellide kaupa, koguhind kuupäeva järgi UUENDUS ##temp_result MÄÄRA davgprice=(dsumprice/@roomnum) KUS hotel_id=@hid JA [kuupäev]=@thisrdate LÕPP LÕPP
TOO JÄRGMINE @my_cursor2 SISSE @infoid; LÕPP lähedal @my_cursor2; --Lülita kursor välja Deallocate @my_cursor2; --vabasta kursor
-- Hotelli järgi arvuta kogu hotelli hind UUENDUS ##temp_result SEA SUMPRIC=(SELECT SUM(room_num*toahind) ALATES ##temp_result TR KUS tr.hotel_id=@hid) KUS hotel_id=@hid -- Arvuta hotelli toa keskmine päevahind UUENDUS ##temp_result SEADISTA sumavgpric=(sumpric/@roomnum/@days) KUS hotel_id=@hid
TOO järgmine my_cursor @hid - mine järgmise kursori juurde, ilma surnud loopideta LÕPP sulge my_cursor -- sulge kursor Vabasta my_cursor - vabasta kursor
-- Lisa hotelli nimi ja toa tüübi nimi ajutisele tabelile UUENDUS ##temp_result SEADISTA hotel_name=(VALI ht.hotel_name dbo.hotel HT KUS ht.hotel_id=##temp_result.hotel_id), room_name=(VALI rt.room_name dbo.room_type RT-rt.room_id=##temp_result.room_id)
-- Kontrolli tulemusi tulemuste tabelist VALI * ##temp_result
-- Ajutiste tabelite lõpetamine IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_hotel') ja type='U') ALUSTA Langeta laud ##temp_hotel LÕPP IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_room') ja type='U') ALUSTA Langeta laud ##temp_room LÕPP IF EKSISTEERIB(vali * tempdb.dbo.sysobjects hulgast, kus id = object_id(N'tempdb.. ##temp_result') ja type='U') ALUSTA Drop table ##temp_result LÕPP
|