Ta objava je bila nazadnje urejena s strani Miaolinsen 6. 12. 2018 ob 17:03
Jaz tega nisem naredil z mysql, ampak z mssql:
/* Določite časovno obdobje in število sob, ki jih je treba rezervirati, poizvedite po hotelih, izbranih vrstah sob in njihovih povprečnih cenah, ki izpolnjujejo pogoje (čas, število preostalih sob), ter jih razvrstite po povprečni ceni od najnižje do najvišje. Rezultati vključujejo hotele, izbrane kombinacije in količine sob ter najnižjo povprečno ceno. ##不要求为同一房型, ampak mora biti isti hotel, in lahko spremeniš vrsto sobe sredi poti. -- Razčlenjevanje: Pomeni, da ni treba upoštevati vrste sobe, upošteva se le število sob ##比如, izberite čas prijave 2018-11-14~2018-11-15, število rezerviranih sob pa je 5 -- Analiza: Hotel mora biti v časovnem obdobju, vsak dan pa obstaja povpraševanje po številu sob (če na določen dan ni nikogar, ne bo ustrezal standardu) ##返回选择酒店A, 11-14 izberite 4 vrste sob z ID 3, 1 tip sobe z ID 2, 11-15 izberite 3 vrste sob z ID 3, 2 vrste sob z ID 2, najnižja cena pa je 2000 -- Analiza: Izračunajte povprečno ceno glede na minimalno dnevno konfiguracijo ##老师要求只能用sql语句, implementacija mysql, ne more uporabljati pythona, c++ itd. */
-- Vhodni parametri, časovno obdobje, število potrebnih sob DATUM @sdate DECLARE = '2018-11-14'; RAZGLASITE @edate DATUM = '2018-11-15'; RAZGLASITE @roomnum INT = 5;
-- Izračunajte število dni bivanja DEKLARIRAJ @days INT; NASTAVI @days = DATEDIFF(DAN, @sdate, @edate)+1;
-- Številka hotela, ki ustreza datumskemu obdobju, število sob ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_hotel') in tip='U') ZAČETEK Spusti mizo ##temp_hotel KONEC
IZBERI ta.hotel_id v ##temp_hotel OD (IZBERI ri. [datum], rt.hotel_id, SUM(ri.ostani) room_num IZ room_info ri LEVO ZDRUŽI SE room_type rt na ri.room_id=rt.room_id kjer @sdate <= [datum] in [datum] <= @edate SKUPINA PO ri. [datum],rt.hotel_id IMA SUM(REMAIN) >= 5) ta SKUPINA Z ta.hotel_id IMA COUNT(*) = @days
-- Izračunano glede na hotel (konfigurirajte minimalno vrsto sobe na dan)
ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_result') in tip='U') ZAČETEK Drop miza ##temp_result KONEC -- Začasna tabela rezultatov Hotel Datum Vrsta sobe ID Vrsta sobe Ime sobe Število sob Cena sobe Hotel Dnevno Skupno Dnevno Povprečna cena hotela Hotel Skupna cena hotela Skupna dnevna povprečna cena hotela Skupna dnevna cena sobe USTVARI TABELO ##temp_result( hotel_id INT, hotel_name varchar(255), [datum] DATUM, room_id INT, room_name VARCHAR(255), room_num INT, roomprice DECIMAL, dsumprice DECIMAL, DAVGPRICE DECIMAL, sumpric DECIMAL, sumavgpric DECIMAL
)
DEKLARIRAJ @hid INT; -- Hotelska izkaznica DEKLARIRAJ @infoid INT; -- informacijski ID --potrdi, da je kazalec zbirka DECLARE my_cursor kazalec za (SELECT hotel_id iz ##temp_hotel); --Odpri kazalec-- Odpri my_cursor --Spremenljivke začetnega kazalca zanke-- prinesi naslednje iz my_cursor v @hid medtem ko @@FETCH_STATUS = 0 -- vrne stanje zadnjega kazaleca, ki ga izvede stavek FETCH -- ZAČETEK -- Glede na hotelsko izkaznico se ponavljajoči datum določa ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_room') in tip='U') ZAČETEK miza za spuščanje ##temp_room KONEC
-- Hoteli, po datumu, s sobami razvrščenimi po datumu Cena IZBERI info_id, [datum], cena, ostani, room_id V ##temp_room IZ dbo.room_info, KJER @sdate <= [datum] in [datum] <= @edate TER OSTANI > 0 IN room_id V (IZBERI rt.room_id IZ dbo.room_type rt, KJER rt.hotel_id=@hid) VRSTNI RED PO [DATUM] ASC, CENA ASC
DECLARE @thisrdate DATUM = NULL; -- Datum DECLARE @thisrnum INT=0; -- Število izbranih sob na trenutni datum
DECLARE @rdate DATE = NULL; -- Datum DECLARE @rmnum INT = 0; -- Število sob glede na vrsto sobe
-- Cikli po datumih OZNAČI @my_cursor2 KAZALEC; nastavi @my_cursor2 = KAZALEC ZA IZBIRO info_id IZ ##temp_room VRSTNI RED PO [DATUM] ASC, CENA ASC ODPRI @my_cursor2; PRINESI NASLEDNJE OD @my_cursor2 V @infoid WHILE(@@FETCH_STATUS=0) ZAČETEK --##temp_result SELECT @rmnum=ostani, @rdate=[datum] OD ##temp_room KJER info_id=@infoid ČE JE (@thisrdate NIČELNA ALI @thisrdate != @rdate) ZAČETEK PRINT @rdate SET @thisrdate = @rdate; NASTAVI @thisrnum = 0; KONEC -- Vrsta sobe za izbiro oblike odmerka ČE(@thisrnum <= @roomnum) ZAČETEK IF (@thisrnum + @rmnum > @roomnum) ZAČETEK -- Število sob, ki jih morate uporabiti SET @rmnum = @roomnum-@thisrnum; KONEC KONEC ELSE ZAČETEK -- Za ta datum ni potreben prostor NASTAVI @rmnum = 0; KONEC
ČE (@rmnum > 0) ZAČETEK -- Dodajte rezultate po določenem številu VSTAVI V ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) IZBERI @hid, '', @thisrdate, room_id, '', @rmnum, cena, 0, 0, 0, 0 OD ##temp_room KJER info_id = @infoid
-- Število sob je doseglo izračunano povprečno ceno SET @thisrnum = @thisrnum + @rmnum; ČE (@thisrnum = @roomnum) ZAČETEK -- Skupna cena po hotelih, izračunana za datume POSODOBITEV ##temp_result NASTAVI dsumprice=(SELECT SUM(room_num*roomprice) IZ ##temp_result TR, KJER tr.hotel_id=@hid IN TR.[ datum]=@thisrdate), KJER hotel_id=@hid IN [datum]=@thisrdate -- Izračunajte povprečno ceno sobe po hotelih, skupno ceno po datumu POSODOBITEV ##temp_result NASTAVI davgprice=(dsumprice/@roomnum), KJER hotel_id=@hid IN [datum]=@thisrdate KONEC KONEC
PRINESI NASLEDNJE IZ @my_cursor2 V @infoid; KONEC tesno @my_cursor2; --Izklopi kazalec Deallocate @my_cursor2; --sprostitveni kazalec
-- Po hotelih izračunamo skupno ceno hotela POSODOBITEV ##temp_result NASTAVI SUMPRIC=(SELECT SUM(room_num*roomprice) OD ##temp_result TR, KJER tr.hotel_id=@hid) KJER hotel_id=@hid -- Izračunajte povprečno dnevno ceno celotne sobe v hotelu POSODOBITEV ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) KJER hotel_id=@hid
PRINESI NEXT iz my_cursor v @hid - pojdi na naslednji kazalec, brez mrtvih zank KONEC Zapri my_cursor -- zapri kazalec Deallocate my_cursor - sprosti kazalec
-- Dodajte ime hotela in tip sobe na začasno mizo POSODOBITEV ##temp_result NASTAVI hotel_name=(IZBERI ht.hotel_name IZ dbo.hotel HT, KJER ht.hotel_id=###temp_result.hotel_id), room_name=(IZBERI rt.room_name IZ dbo.room_type rt, KJER rt.room_id=##temp_result.room_id)
-- Preverite rezultate iz tabele rezultatov IZBERI * IZ ##temp_result
-- Končno čiščenje začasnih tabel ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_hotel') in tip='U') ZAČETEK Spusti mizo ##temp_hotel KONEC ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_room') in tip='U') ZAČETEK miza za spuščanje ##temp_room KONEC ČE OBSTAJA(izberi * iz tempdb.dbo.sysobjects kjer id = object_id(N'tempdb.. ##temp_result') in tip='U') ZAČETEK Drop miza ##temp_result KONEC
|