Dette innlegget ble sist redigert av Miaolinsen 6.12.2018 kl. 17:03
Jeg gjorde det ikke med MySQL, jeg gjorde det med mssql:
/* Spesifiser tidsintervallet og antall rom som skal bookes, søk etter hoteller, romtyper og deres gjennomsnittspriser som oppfyller kravene (tid, antall rom igjen), og sorter dem etter gjennomsnittspris fra lavest til høyest. Resultatene inkluderer hoteller, utvalgte romkombinasjoner og mengder, samt lavest gjennomsnittspris. ##不要求为同一房型, men det må være det samme hotellet, og du kan endre romtypen underveis. -- Parsing: Det betyr at det ikke er nødvendig å ta hensyn til romtypen, kun antall rom tas med ##比如, velg innsjekkingstidspunktet 2018-11-14~2018-11-15, og antall reserverte rom er 5 -- Analyse: Hotellet må være innenfor datointervallet, og det er etterspørsel etter antall rom hver dag (hvis det ikke er noen på en bestemt dag, vil det ikke møte standarden) ##返回选择酒店A, 11-14 velg 4 romtyper med ID 3, 1 romtype med ID 2, 11-15 velg 3 romtyper med ID 3, 2 romtyper med ID 2, og laveste pris er 2000 -- Analyse: Beregn gjennomsnittsprisen i henhold til minimumskonfigurasjon per dag ##老师要求只能用sql语句, MySQL-implementering, kan ikke bruke Python, C++, osv. */
-- Innkommende parametere, datointervall, antall rom som kreves OPPGI @sdate DATO = '2018-11-14'; OPPGI @edate DATO = '2018-11-15'; DEKLAR @roomnum INT = 5;
-- Beregn antall dager med opphold ERKLÆR @days INT; SETT @days = DATEDIFF(DAG, @sdate, @edate)+1;
-- Hotellnummer som oppfyller datointervallet, antall rom IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_hotel') og type='U') START Slippbord ##temp_hotel SLUTT
VELG ta.hotel_id i ##temp_hotel FRA (VELG ri. [dato], rt.hotel_id, SUM(ri.remain) room_num FRA room_info ri VENSTRE JOIN room_type rt på ri.room_id=rt.room_id hvor @sdate <= [dato] og [date] <= @edate GRUPPE ETTER ri. [dato],rt.hotel_id SOM HAR SUM(REMAIN) >= 5) ta GRUPPER ETTER ta.hotel_id HAR TELLER(*) = @days
-- Beregnet i henhold til hotellet (konfigurer minimum romtype per dag)
IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_result') og type='U') START Slippbord ##temp_result SLUTT -- Foreløpig resultattabell Hotelldato Romtype ID Romtype Navn Antall rom Pris Hotell Daglig total hotellpris Gjennomsnittlig hotellpris Hotell totalt hotellpris Totalt Daglig gjennomsnittspris på hotell Totalt daglig gjennomsnittspris på hotell Totalt daglig rompris OPPRETT TABELL ##temp_result( hotel_id INT, hotel_name varchar(255), [dato] DATO, room_id INT, room_name VARCHAR (255), room_num INT, rompris DESIMAL, dsumpris DECIMAL, davgprice DESIMAL, SUMPRIC DESIMAL, sumavgpric DESIMAL
)
KUNNGJØR @hid INT; -- Hotell-ID ERKLÆR @infoid INT; -- info id --bekrefte at markøren er en samling DEKLAR my_cursor markør for (VELG hotel_id fra ##temp_hotel); --Åpen markør-- Åpne my_cursor --Start Loop Cursor-variabler-- hent neste fra my_cursor inn i @hid mens @@FETCH_STATUS = 0 -- returnerer tilstanden til den siste markøren utført av FETCH-setningen -- START -- Basert på hotell-ID, prises den gjentakende datoen IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_room') og type='U') START Slippbord ##temp_room SLUTT
-- Hoteller, etter dato, med rom sortert etter dato Pris VELG info_id, [dato], pris, forbli, room_id INN I ##temp_room FRA dbo.room_info HVOR @sdate <= [dato] og [dato] <= @edate OG forbli > 0 OG room_id I (VELG rt.room_id FRA dbo.room_type rt HVOR rt.hotel_id=@hid) BESTILL ETTER [dato] ASC, pris ASC
ERKLÆR @thisrdate DATO = NULL; -- Date ERKLÆR @thisrnum INT=0; -- Antall rom valgt på gjeldende dato
ERKLÆR @rdate DATO = NULL; -- Date ERKLÆR @rmnum INT = 0; -- Antall rom etter romtype
-- Syklus etter dato DEKLAR @my_cursor2 MARKØR; sett @my_cursor2 = MARKØR FOR VELG info_id FRA ##temp_room ORDNE ETTER [dato] ASC, pris ASC ÅPNE @my_cursor2; HENT NESTE FRA @my_cursor2 TIL @infoid WHILE(@@FETCH_STATUS=0) START --##temp_result VELG @rmnum=forbli, @rdate=[dato] FRA ##temp_room HVOR info_id=@infoid HVIS (@thisrdate ER NULL ELLER @thisrdate != @rdate) START TRYKK @rdate SETT @thisrdate = @rdate; SETT @thisrnum = 0; SLUTT -- Romtype for valg av doseringsform HVIS(@thisrnum <= @roomnum) START HVIS (@thisrnum + @rmnum > @roomnum) START -- Antall rom du må bruke SETT @rmnum = @roomnum-@thisrnum; SLUTT SLUTT ELSE START -- Det trengs ikke plass til den datoen SETT @rmnum = 0; SLUTT
HVIS (@rmnum > 0) START -- Legg til resultater etter spesifisert antall SETT INN I ##temp_result(hotel_id, hotel_name, [dato], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) VELG @hid, '', @thisrdate, room_id, '', @rmnum, pris, 0, 0, 0 FRA ##temp_room HVOR info_id = @infoid
-- Antall rom har nådd den beregnede gjennomsnittsprisen SETT @thisrnum = @thisrnum + @rmnum; HVIS (@thisrnum = @roomnum) START -- Totalpris per hotell, beregnet for datoer OPPDATERING ##temp_result SETT dsumprice=(VELG SUM(room_num*roomprice) FRA ##temp_result tr HVOR tr.hotel_id=@hid OG tr.[ dato]=@thisrdate) HVOR hotel_id=@hid OG [dato]=@thisrdate -- Beregn gjennomsnittlig rompris per hotell, total pris per dato OPPDATERING ##temp_result SETT davgprice=(dsumprice/@roomnum) HVOR hotel_id=@hid OG [date]=@thisrdate SLUTT SLUTT
HENT NESTE FRA @my_cursor2 TIL @infoid; SLUTT Nær @my_cursor2; --Slå av markøren Deallocate @my_cursor2; --frigjøringsmarkør
-- Etter hotell, beregn den totale hotellprisen OPPDATERING ##temp_result SETT sumpric=(VELG SUM(room_num*roomprice) FRA ##temp_result tr HVOR tr.hotel_id=@hid) HVOR hotel_id=@hid -- Beregne gjennomsnittlig dagspris for det totale rommet på hotellet OPPDATERING ##temp_result SETT sumavgpric=(sumpric/@roomnum/@days) HVOR hotel_id=@hid
HENT neste fra my_cursor inn i @hid – gå til neste markør, ingen deadloops SLUTT lukk my_cursor – lukk markøren Utplasser my_cursor – slipp markøren
-- Legg til hotellnavnet og romtypenavnet i den midlertidige tabellen OPPDATERING ##temp_result SETT hotel_name=(VELG ht.hotel_name FRA dbo.hotel HT HVOR ht.hotel_id=##temp_result.hotel_id), room_name=(VELG rt.room_name FRA dbo.room_type RT HVOR rt.room_id=##temp_result.room_id)
-- Sjekk resultatene fra resultattabellen VELG * FRA ##temp_result
-- Avslutt tøming av midlertidige tabeller IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_hotel') og type='U') START Slippbord ##temp_hotel SLUTT IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_room') og type='U') START Slippbord ##temp_room SLUTT IF EXISTS(velg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_result') og type='U') START Slippbord ##temp_result SLUTT
|