Tätä julkaisua muokasi viimeksi Miaolinsen 6.12.2018 klo 17:03
En tehnyt sitä mysql:llä, vaan mssql:llä:
/* Määrittele aikaväli ja varattavien huoneiden määrä, kysy hotelleista, huonetyypeistä ja niiden keskimääräisistä hinnoista, jotka täyttävät ehdot (aika, jäljellä olevien huoneiden määrä), ja lajittele ne keskimääräisen hinnan mukaan alimmasta korkeimpaan. Tulokset sisältävät hotellit, valitut huoneyhdistelmät ja määrät sekä alhaisimman keskihinnan. ##不要求为同一房型, mutta sen täytyy olla sama hotelli, ja huonetyyppiä voi vaihtaa kesken ajan. -- Jäsentäminen: Se tarkoittaa, ettei huonetyyppiä tarvitse ottaa huomioon, vaan ainoastaan huoneiden määrä otetaan huomioon ##比如, valitse sisäänkirjautumisaika 2018-11-14~2018-11-15, ja varattujen huoneiden määrä on 5 -- Analyysi: Hotellin tulee olla päivämääräalueella, ja huoneiden määrälle on kysyntää joka päivä (jos tiettynä päivänä ei ole ketään, se ei täytä vaatimuksia) ##返回选择酒店A, 11-14 valitse 4 huonetyyppiä tunnuksella 3, 1 huonetyyppi tunnuksella 2, 11-15 valitse 3 huonetyyppiä tunnuksella 3, 2 huonetyyppiä tunnuksella 2, ja alhaisin hinta on 2000 -- Analyysi: Laske keskimääräinen hinta minimikokoonpanon mukaan päivässä ##老师要求只能用sql语句, mySQL-toteutus, en voi käyttää pythonia, C++:a jne. */
-- Saapuvat parametrit, aikaväli, tarvittavien huoneiden määrä DECARE @sdate DATE = '2018-11-14'; DECARE @edate DATE = '2018-11-15'; DEKLARE @roomnum INT = 5;
-- Laske oleskelupäivien määrä DECARE @days INT; JOUKKO @days = DATEDIFF(PÄIVÄ, @sdate, @edate)+1;
-- Hotellin numero, joka täyttää päivämääräjään, huoneiden määrä JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_hotel') ja type='U') ALOITA Pudota pöytä ##temp_hotel LOPPU
VALITSE ta.hotel_id ##temp_hotel KOHDASTA (VALITSE ri. [date], rt.hotel_id, SUM(ri.remain) room_num room_info RI VASEMMALLE LIITTYY room_type rt ri.room_id=rt.room_id missä @sdate <= [date] ja [date] <= @edate RYHMÄ ri:n mukaan. [date],rt.hotel_id HAVING SUM(REMAIN) >= 5) ta RYHMITTELE ta.hotel_id COUNT(*) = @days
-- Laskettu hotellin mukaan (määritä minimihuonetyyppi päivässä)
JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_result') ja type='U') ALOITA Pudota pöytä ##temp_result LOPPU -- Alustava tulostaulukko Hotelli Päivämäärä Huone Tyyppi ID Huoneen tyyppi Nimi Huoneiden määrä Huoneen hinta Hotelli Päivittäin Yhteensä Hotelli Päivittäinen Keskimääräinen Hotellin hinta Hotelli Kokonaishinta Hotellin Kokonaishinta Hotellin Kokonaismäärä Päivittäinen Huoneen Hinta Yhteensä Päivittäinen Huoneen Hinta LUO TAULU ##temp_result( hotel_id INT, hotel_name Varchar (255), [päivämäärä] PÄIVÄMÄÄRÄ, room_id INT, room_name VARCHAR(255), room_num INT, huoneen hinta DESIMAALI, dsumprice DESIMAALI, davgprice DESIMAALI, sumpric DECIMAL, sumavgpric DECIMAL
)
DECARE @hid INT; -- Hotellin henkilöllisyystodistus DECARE @infoid INT; -- info ID --vahvistaa, että kursori on kokoelma DECLARE my_cursor kursori (SELECT hotel_id ##temp_hotel); --Avaa kursori-- Avaa my_cursor --Aloitussilmukan kursorimuuttujat-- nouda seuraavaksi my_cursor:sta @hid kun taas @@FETCH_STATUS = 0 -- palauttaa viimeisen FETCH-lauseen suorittaman kursorin tilan -- ALOITA -- Hotellin ID:n perusteella toistuva päivämäärä on hinnoiteltu JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_room') ja type='U') ALOITA Pudota pöytä ##temp_room LOPPU
-- Hotellit päivämäärän mukaan, huoneet järjestetty päivämäärän mukaan Hinta VALITSE info_id, [date], price, remain, room_id MUOTOON ##temp_room SIELTÄ dbo.room_info MISSÄ @sdate <= [date] ja [date] <= @edate JA pysy > 0 JA room_id IN (VALITSE rt.room_id JOUKOSTA dbo.room_type rt MISSÄ rt.hotel_id=@hid) TILAA [päivämäärä] ASC, hinta ASC
DEKLARARE @thisrdate DATE = NULL; -- Päivämäärä JULISTA @thisrnum INT=0; -- Valittujen huoneiden määrä nykyisenä päivänä
DECARE @rdate DATE = NULL; -- Päivämäärä DEKLARE @rmnum INT = 0; -- Huoneiden määrä huonetyypin mukaan
-- Sykli päivämäärän mukaan JULISTA @my_cursor2 KURSORI; aseta @my_cursor2 = KURSORI VALITSE info_id JOUKOSTA ##temp_room TILAA [PÄIVÄMÄÄRÄ] ASC, hinta ASC OPEN @my_cursor2; HAE SEURAAVAKSI @my_cursor2 SISÄÄN @infoid WHILE(@@FETCH_STATUS=0) ALOITA --##temp_result VALITSE @rmnum=jää, @rdate=[päivämäärä] LÄHTEESTÄ ##temp_room, MISSÄ info_id=@infoid JOS (@thisrdate ON NOLLA TAI @thisrdate != @rdate) ALOITA TULOSTA @rdate SET @thisrdate = @rdate; JOUKKO @thisrnum = 0; LOPPU -- Annoslomakkeen valintahuoneen tyyppi IF(@thisrnum <= @roomnum) ALOITA IF (@thisrnum + @rmnum > @roomnum) ALOITA -- Huoneiden määrä, joita sinun täytyy käyttää SET @rmnum = @roomnum-@thisrnum; LOPPU LOPPU MUUTEN ALOITA -- Tilaa ei vaadita tuolle päivämäärälle JOUKKO @rmnum = 0; LOPPU
JOS (@rmnum > 0) ALOITA -- Lisää tulokset määritellyn numeron mukaan LISÄÄ TIEDOSTOON ##temp_result(hotel_id, hotel_name, [date], room_id, room_name, room_num, huonehinta, dsumprice, davgprice, sumpric, sumavgpric) VALITSE @hid, '', @thisrdate, room_id, '', @rmnum, hinta, 0, 0, 0, 0 ###temp_room MISSÄ info_id = @infoid
-- Huoneiden määrä on saavuttanut lasketun keskihinnan SET @thisrnum = @thisrnum + @rmnum; JOS (@thisrnum = @roomnum) ALOITA -- Kokonaishinta hotelleittain, laskettuna päivämäärille PÄIVITYS ##temp_result ASETA dsumprice=(VALITSE SUM(room_num*huonehinta) POIS ##temp_result TR MISSÄ tr.hotel_id=@hid JA TR.[ date]=@thisrdate) MISSÄ hotel_id=@hid JA [date]=@thisrdate -- Laske keskimääräinen huonehinta hotellin mukaan, kokonaishinta päivämäärän mukaan PÄIVITYS ##temp_result ASETA davgprice=(dsumprice/@roomnum) MISSÄ hotel_id=@hid JA [date]=@thisrdate LOPPU LOPPU
NOUDA SEURAAVAKSI @my_cursor2 SISÄÄN @infoid; LOPPU lähellä @my_cursor2; --Sammuta kursori Deallocate @my_cursor2; --vapauta kursori
-- Hotellin mukaan laske hotellin kokonaishinta PÄIVITYS ##temp_result ASETA SUMPRIC=(VALITSE SUM(room_num*huonehinta) POIS ##temp_result TR MISSÄ tr.hotel_id=@hid) MISSÄ hotel_id=@hid -- Laske hotellin koko huoneen keskimääräinen päivittäinen hinta PÄIVITYS ##temp_result ASETA sumavgpric=(sumpric/@roomnum/@days) MISSÄ hotel_id=@hid
NOUDA seuraavaksi my_cursor:sta @hid – siirry seuraavalle kursorille, ei kuolleita silmukoita LOPPU Sulje my_cursor -- sulje kursori Vapauta my_cursor - vapauta kursori
-- Lisää hotellin nimi ja huonetyypin nimi väliaikaiseen pöytään PÄIVITYS ##temp_result ASETA hotel_name=(VALITSE ht.hotel_name DBO.hotel HT MISSÄ ht.hotel_id=##temp_result.hotel_id), room_name=(VALITSE rt.room_name dbo.room_type RT:STÄ, MISSÄ rt.room_id=##temp_result.room_id)
-- Tarkista tulokset tulostaulukosta VALITSE * JOUKOSTA ##temp_result
-- Lopeta väliaikaisten taulukoiden tyhjentäminen JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_hotel') ja type='U') ALOITA Pudota pöytä ##temp_hotel LOPPU JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_room') ja type='U') ALOITA Pudota pöytä ##temp_room LOPPU JOS ON olemassa (valitse * joukosta tempdb.dbo.sysobjects, missä id = object_id(N'tempdb.. ##temp_result') ja type='U') ALOITA Pudota pöytä ##temp_result LOPPU
|