Această postare a fost editată ultima dată de Miaolinsen pe 2018-12-6 17:03
Nu am făcut-o cu mysql, am făcut-o cu mssql:
/* Specifică intervalul de timp și numărul de camere de rezervat, interogă hotelurile, tipurile de camere și prețurile medii care corespund condițiilor (ora, numărul de camere rămase) și sortează-le după prețul mediu de la cel mai mic la cel mai mare. Rezultatele includ hoteluri, combinații și cantități selectate de camere, precum și cel mai mic preț mediu. ##不要求为同一房型, dar trebuie să fie același hotel și poți schimba tipul camerei la jumătate. -- Parsing: Înseamnă că nu este nevoie să se ia în considerare tipul camerei, doar numărul de camere este luat în considerare ##比如, selectați ora de check-in 2018-11-14~2018-11-15, iar numărul de camere rezervate este 5 -- Analiză: Hotelul trebuie să fie în intervalul de date și există cerere pentru numărul de camere pe zi (dacă nu există nimeni într-o anumită zi, nu va îndeplini standardul) ##返回选择酒店A, 11-14 selectează 4 tipuri de camere cu ID 3, 1 tip de cameră cu ID 2, 11-15 selectează 3 tipuri de camere cu ID 3, 2 tipuri de camere cu ID 2, iar cel mai mic preț este 2000 -- Analiză: Calculează prețul mediu conform configurației minime pe zi ##老师要求只能用sql语句, implementare mysql, nu poate folosi python, c++ etc. */
-- Parametri de intrare interval de date, număr de camere necesare DECLARAȚI DATA @sdate = '2018-11-14'; DECLARAȚI DATA @edate = '2018-11-15'; DECLARAȚI @roomnum INT = 5;
-- Calculează numărul de zile de ședere DECLARĂ @days INT; SET @days = DATEDIFF(ZI, @sdate, @edate)+1;
-- Numărul hotelului care corespunde intervalului de date, numărul de camere IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_hotel') și tip='U') START Drop Table ##temp_hotel SFÂRȘIT
SELECTEAZĂ ta.hotel_id în ##temp_hotel DE LA (SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num DIN room_info ri LEFT JOIN room_type rt pe ri.room_id=rt.room_id unde @sdate <= [data] și [data] <= @edate GRUP CU ri. [data],rt.hotel_id AVÂND SUMĂ(rămâne) >= 5) ta GRUPAȚI DUPĂ ta.hotel_id AVÂND COUNT(*) = @days
-- Calculat în funcție de hotel (configurează tipul minim de cameră pe zi)
IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_result') și tip='U') START Drop Table ##temp_result SFÂRȘIT -- Tabel provizoriu de rezultate Hotel Date Date Tip ID cameră Tip Nume cameră Număr camere Preț cameră Hotel Zilnic Total hotel Preț mediu zilnic Hotel Hotel Total hotel Total Preț mediu zilnic Hotel Total Preț zilnic al camerei CREEAZĂ TABELUL ##temp_result( hotel_id INT, hotel_name varchar (255), [data] DATA, room_id INT, room_name VARCHAR (255), room_num INT, Prețul camerei ZECIMAL, dsumprice DECIMAL, davgprice DECIMAL, sumric DECIMAL, ZECIMALUL sumavgpric
)
DECLARĂ @hid INT; -- ID hotel DECLARĂ @infoid INT; -- info id --afirmă că cursorul este o colecție DECLARE my_cursor cursor pentru (SELECT hotel_id din ##temp_hotel); --Cursor deschis-- Deschide my_cursor --Variabile cursor de buclă start-- Adu-i apoi de la my_cursor în @hid în timp ce @@FETCH_STATUS = 0 -- returnează starea ultimului cursor executat de instrucțiunea FETCH -- START -- Pe baza ID-ului hotelului, data recurentă este evaluată IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_room') și tip='U') START Drop Table ##temp_room SFÂRȘIT
-- Hoteluri, după dată, cu camere sortate după dată Tarif SELECTAȚI info_id, [dată], preț, rămâneți room_id ÎN ##temp_room DIN dbo.room_info UNDE @sdate <= [dată] și [dată] <= @edate ȘI rămâneți > 0 ȘI room_id ÎN (SELECTAȚI rt.room_id DIN dbo.room_type rt UNDE rt.hotel_id=@hid) COMANDĂ DUPĂ [data] ASC, preț ASC
DECLARE @thisrdate DATĂ = NUL; -- Date DECLARĂ @thisrnum INT=0; -- Numărul de camere selectate la data curentă
DECLARE @rdate DATĂ = NUL; -- Date DECLARAȚI @rmnum INT = 0; -- Numărul de camere după tipul camerei
-- Ciclează după dată DECLARAȚI @my_cursor2 CURSOR; setați @my_cursor2 = CURSOR PENTRU SELECT info_id DIN ##temp_room COMANDĂ DUPĂ [data] ASC, preț ASC DESCHIDE @my_cursor2; ADU APOI DE LA @my_cursor2 ÎN @infoid WHILE(@@FETCH_STATUS=0) START --##temp_result SELECT @rmnum=remain, @rdate=[data] DIN ##temp_room UNDE info_id=@infoid DACĂ (@thisrdate ESTE NUL SAU @thisrdate != @rdate) START PRINT @rdate MULȚIMEA @thisrdate = @rdate; MULȚIMEA @thisrnum = 0; SFÂRȘIT -- Tipul camerei de selecție a formei dozale DACĂ(@thisrnum <= @roomnum) START IF (@thisrnum + @rmnum > @roomnum) START -- Numărul de camere pe care trebuie să le folosești MULȚIMEA @rmnum = @roomnum-@thisrnum; SFÂRȘIT SFÂRȘIT ALTFEL START -- Nu este necesară nicio cameră pentru acea dată MULȚIMEA @rmnum = 0; SFÂRȘIT
DACĂ (@rmnum > 0) START -- Adaugă rezultatele după numărul specificat INSERAȚI ÎN ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, preț camere, dsumprice, davgprice, sumpric, sumavgpric) SELECTAȚI @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DE LA ##temp_room UNDE info_id = @infoid
-- Numărul camerelor a atins prețul mediu calculat MULȚIMEA @thisrnum = @thisrnum + @rmnum; DACĂ (@thisrnum = @roomnum) START -- Prețul total pe hotel, calculat pentru date ACTUALIZARE ##temp_result SETEAZĂ dsumprice=(SELECT SUM(room_num*roomprice) DIN ##temp_result tr UNDE tr.hotel_id=@hid ȘI TR.[ data]=@thisrdate) UNDE hotel_id=@hid ȘI [data]=@thisrdate -- Calculează tariful mediu al camerei pe hotel, prețul total după dată ACTUALIZARE ##temp_result SET davgprice=(dsumprice/@roomnum) UNDE hotel_id=@hid ȘI [data]=@thisrdate SFÂRȘIT SFÂRȘIT
ADUCĂ APOI DE LA @my_cursor2 ÎN @infoid; SFÂRȘIT aproape @my_cursor2; --Oprește cursorul deallocate @my_cursor2; --eliberează cursorul
-- Pe hotel, se calculează prețul total al hotelului ACTUALIZARE ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) DIN ##temp_result TR UNDE tr.hotel_id=@hid) UNDE hotel_id=@hid -- Calculează prețul mediu zilnic al totalului camerei din hotel ACTUALIZARE ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) UNDE hotel_id=@hid
FETCH next de la my_cursor la @hid - treci la următorul cursor, fără deadloop-uri SFÂRȘIT Închide my_cursor -- închide cursorul Deallocate my_cursor - eliberează cursorul
-- Adaugă numele hotelului și tipul camerei pe tabelul temporar ACTUALIZARE ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht UNDE ht.hotel_id=##temp_result.hotel_id), room_name=(SELECT rt.room_name FROM dbo.room_type rt UNDE rt.room_id=##temp_result.room_id)
-- Verifică rezultatele din tabelul de rezultate SELECTEAZĂ * DIN ##temp_result
-- Sfârșitul curățării tabelelor temporare IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_hotel') și tip='U') START Drop Table ##temp_hotel SFÂRȘIT IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_room') și tip='U') START Drop Table ##temp_room SFÂRȘIT IF EXISTS(select * din tempdb.dbo.sysobjects unde id = object_id(N'tempdb.. ##temp_result') și tip='U') START Drop Table ##temp_result SFÂRȘIT
|