Šį pranešimą paskutinį kartą redagavo Miaolinsen 2018-12-6 17:03
Aš to nepadariau su mysql, aš tai padariau su mssql:
/* Nurodykite laiko intervalą ir užsakomų kambarių skaičių, užklauskite viešbučių, kambarių tipų pasirinkimą ir jų vidutines kainas, atitinkančias sąlygas (laiką, likusių kambarių skaičių), ir rūšiuokite juos pagal vidutinę kainą nuo mažiausios iki didžiausios. Rezultatai apima viešbučius, pasirinktus kambarių derinius ir kiekius bei mažiausią vidutinę kainą. ##不要求为同一房型, bet tai turi būti tas pats viešbutis, o kambario tipą galite pakeisti pusiaukelėje. -- Analizė: Tai reiškia, kad nereikia atsižvelgti į kambario tipą, atsižvelgiama tik į kambarių skaičių ##比如, pasirinkite atvykimo laiką 2018-11-14~2018-11-15, o užsakytų kambarių skaičius yra 5 -- Analizė: Viešbutis turi būti datų diapazone, o kambarių skaičius yra paklausus kiekvieną dieną (jei tam tikrą dieną nieko nėra, jis neatitiks standarto) ##返回选择酒店A, 11-14 pasirinkite 4 kambarių tipus su ID 3, 1 kambario tipą su ID 2, 11-15 pasirinkite 3 kambarių tipus su ID 3, 2 kambarių tipus su ID 2, o mažiausia kaina yra 2000 -- Analizė: Apskaičiuokite vidutinę kainą pagal minimalią konfigūraciją per dieną ##老师要求只能用sql语句, MySQL įgyvendinimas, negali naudoti Python, C++ ir kt. */
-- Gaunami parametrai datų diapazonas, reikalingų kambarių skaičius DEKLARUOTI @sdate DATĄ = '2018-11-14'; DEKLARUOTI @edate DATĄ = '2018-11-15'; DEKLARUOKITE @roomnum INT = 5;
-- Apskaičiuokite buvimo dienų skaičių DEKLARUOTI @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Viešbučio numeris, atitinkantis dienų seką, kambarių skaičius IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') ir type='U') PRADĖTI Išmeskite lentelę ##temp_hotel PABAIGA
PASIRINKITE ta.hotel_id į ##temp_hotel NUO (SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num FROM room_info ri LEFT JOIN room_type rt on ri.room_id=rt.room_id kur @sdate <= [date] ir [date] <= @edate GROUP BY ri. [data],rt.hotel_id TURINTYS SUM(likti) >= 5) ta GRUPUOTI PAGAL ta.hotel_id, KURIŲ COUNT(*) = @days
-- Skaičiuojama pagal viešbutį (sukonfigūruokite minimalų kambario tipą per dieną)
IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') ir type='U') PRADĖTI Išmeskite lentelę ##temp_result PABAIGA -- Preliminari rezultatų lentelė Viešbučio data Kambario tipas ID Kambario tipas Pavadinimas Kambarių skaičius Kambario kaina Viešbutis Diena Bendra viešbučio kaina Viešbutis Bendra dienos kaina Viešbutis Bendra dienos kaina Viešbutis Bendra dienos kaina Viešbučio kaina SUKURTI LENTELĘ ##temp_result( hotel_id INT, hotel_name varchar(255), [data] DATA, room_id INT, room_name VARCHAR [255], room_num INT, kambario kaina dešimtainė, dsumprice DECIMALINIS, davgprice DEŠIMTAINIS, sumpric DEŠIMTAINĖ, sumavgpric DECIMAL
)
DEKLARUOTI @hid INT; -- Viešbučio ID DEKLARUOTI @infoid INT; -- info id --patvirtinti, kad žymeklis yra rinkinys DECLARE my_cursor žymeklį (SELECT hotel_id iš ##temp_hotel); --Atidaryti žymeklį-- Atidarykite my_cursor --Start Loop žymeklio kintamieji-- Atnešti kitą iš my_cursor į @hid o @@FETCH_STATUS = 0 -- grąžina paskutinio žymeklio, kurį vykdo FETCH sakinys, būseną -- PRADĖTI -- Pagal viešbučio ID nustatoma pasikartojančios datos kaina IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') ir type='U') PRADĖTI Išmeskite lentelę ##temp_room PABAIGA
-- Viešbučiai pagal datą, su kambariais surūšiuoti pagal datą Kaina SELECT info_id, [date], price, remain room_id Į ##temp_room FROM dbo.room_info KUR @sdate <= [date] ir [date] <= @edate IR LIEKA > 0 IR room_id (PASIRINKITE rt.room_id IŠ dbo.room_type rt KUR rt.hotel_id=@hid) UŽSAKYMAS PAGAL [data] ASC, kaina ASC
DEKLARUOTI @thisrdate DATĄ = NULINĘ; -- Data DEKLARUOTI @thisrnum INT=0; -- Dabartinę dieną pasirinktų kambarių skaičius
DEKLARUOTI @rdate DATĄ = NULINĘ; -- Data DEKLARUOTI @rmnum INT = 0; -- Kambarių skaičius pagal kambario tipą
-- Ciklas pagal datą PASKELBTI @my_cursor2 ŽYMEKLĮ; nustatyti @my_cursor2 = ŽYMEKLIS PASIRINKTI info_id IŠ ##temp_room UŽSAKYTI PAGAL [data] ASC, kaina ASC ATVIRAS @my_cursor2; GAUTI KITĄ IŠ @my_cursor2 Į @infoid WHILE(@@FETCH_STATUS=0) PRADĖTI --##temp_result SELECT @rmnum=remain, @rdate=[date] FROM ##temp_room WHERE info_id=@infoid JEI (@thisrdate YRA NULINIS ARBA @thisrdate != @rdate) PRADĖTI SPAUSDINTI @rdate NUSTATYTI @thisrdate = @rdate; SET @thisrnum = 0; PABAIGA -- Dozavimo formos parinkimas kambario tipas IF(@thisrnum <= @roomnum) PRADĖTI IF (@thisrnum + @rmnum > @roomnum) PRADĖTI -- Kambarių skaičius, kurį reikia naudoti SET @rmnum = @roomnum-@thisrnum; PABAIGA PABAIGA KITAIP PRADĖTI -- Šiai datai nereikia vietos NUSTATYTI @rmnum = 0; PABAIGA
JEI (@rmnum > 0) PRADĖTI -- Pridėti rezultatus pagal nurodytą skaičių ĮTERPTI Į ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) PASIRINKITE @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0, 0 NUO ##temp_room KUR info_id = @infoid
-- Kambarių skaičius pasiekė apskaičiuotą vidutinę kainą NUSTATYTI @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) PRADĖTI -- Bendra kaina pagal viešbutį, skaičiuojama pagal datas UPDATE ##temp_result SET dsumprice=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid AND tr.[ data]=@thisrdate) KUR hotel_id=@hid IR [data]=@thisrdate -- Apskaičiuokite vidutinę kambario kainą pagal viešbutį, bendrą kainą pagal datą UPDATE ##temp_result SET davgprice=(dsumprice/@roomnum) KUR hotel_id=@hid IR [data]=@thisrdate PABAIGA PABAIGA
ATNEŠTI KITĄ IŠ @my_cursor2 Į @infoid; PABAIGA uždaryti @my_cursor2; --Išjunkite žymeklį perskirstyti @my_cursor2; --atleiskite žymeklį
-- Pagal viešbutį, apskaičiuokite bendrą viešbučio kainą ATNAUJINTI ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) FROM ##temp_result tr WHERE tr.hotel_id=@hid) WHERE hotel_id=@hid -- Apskaičiuokite vidutinę dienos kainą už visą kambarį viešbutyje ATNAUJINKITE ##temp_result NUSTATYKITE sumavgpric=(sumpric/@roomnum/@days) KUR hotel_id=@hid
ATNEŠTI TOLIAU iš my_cursor į @hid - pereiti prie kito žymeklio, jokių aklavietės PABAIGA uždaryti my_cursor -- uždaryti žymeklį Išskirkite my_cursor - atleiskite žymeklį
-- Pridėkite viešbučio pavadinimą ir kambario tipo pavadinimą prie laikinos lentelės ATNAUJINKITE ##temp_result NUSTATYKITE hotel_name=(PASIRINKITE ht.hotel_name IŠ dbo.hotel ht KUR ht.hotel_id=##temp_result.hotel_id), room_name=(PASIRINKITE rt.room_name IŠ dbo.room_type rt KUR rt.room_id=##temp_result.room_id)
-- Patikrinkite rezultatus iš rezultatų lentelės PASIRINKITE * IŠ ##temp_result
-- Baigti laikinų lentelių valymą IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_hotel') ir type='U') PRADĖTI Išmeskite lentelę ##temp_hotel PABAIGA IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_room') ir type='U') PRADĖTI Išmeskite lentelę ##temp_room PABAIGA IF EXISTS(pasirinkite * iš tempdb.dbo.sysobjects, kur id = object_id(N'tempdb.. ##temp_result') ir type='U') PRADĖTI Išmeskite lentelę ##temp_result PABAIGA
|