Dette indlæg blev sidst redigeret af Miaolinsen den 6-12-2018 kl. 17:03
Jeg gjorde det ikke med MySQL, jeg gjorde det med mssql:
/* Angiv tidsintervallet og antallet af værelser, der skal bookes, forespørg hotellerne, værelsestyper og deres gennemsnitlige priser, der opfylder betingelserne (tid, antal værelser tilbage), og sorter dem efter gennemsnitspris fra lavest til højest. Resultaterne inkluderer hoteller, udvalgte værelseskombinationer og mængder samt den laveste gennemsnitspris. ##不要求为同一房型, men det må være det samme hotel, og du kan ændre værelsestypen undervejs. -- Parsing: Det betyder, at der ikke er behov for at tage hensyn til rumtypen, kun antallet af rum tages i betragtning ##比如, vælg check-in tidspunktet 2018-11-14~2018-11-15, og antallet af bookede værelser er 5 -- Analyse: Hotellet skal være inden for datointervallet, og der er efterspørgsel efter antal værelser hver dag (hvis der ikke er nogen på en bestemt dag, vil det ikke opfylde standarden) ##返回选择酒店A, 11-14 vælg 4 værelsestyper med ID 3, 1 værelsestype med ID 2, 11-15 vælg 3 værelsestyper med ID 3, 2 værelsestyper med ID 2, og den laveste pris er 2000 -- Analyse: Beregn gennemsnitsprisen i henhold til minimumskonfigurationen pr. dag ##老师要求只能用sql语句, MySQL-implementering, kan ikke bruge python, c++ osv. */
-- Indkommende parametre, datointerval, antal ønskede værelser OPLYS @sdate DATO = '2018-11-14'; OPLYS @edate DATO = '2018-11-15'; DEKLAR @roomnum INT = 5;
-- Beregn antallet af opholdsdage ERKLÆR @days INT; SÆT @days = DATO U(DAG, @sdate, @edate)+1;
-- Hotelnummer, der opfylder datointervallet, antal værelser IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_hotel') og type='U') BEGYND Drop-tabel ##temp_hotel SLUT
VÆLG ta.hotel_id i ##temp_hotel FRA (VÆLG 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 [dato] <= @edate GRUPPE EFTER ri. [dato],rt.hotel_id HAR SUM(REMAIN) >= 5) ta GRUPPER EFTER ta.hotel_id HAR TÆLLE(*) = @days
-- Beregnet i henhold til hotellet (indstil minimumsværelsestypen pr. dag)
IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_result') og type='U') BEGYND Drop-bord ##temp_result SLUT -- Foreløbig resultattabel Hoteldato Værelsestype ID Værelsestype Værelsestype Navn Antal værelser Værelsespris Hotel Dagligt samlet hotelpris Daglig gennemsnitlig hotelpris Samlet hotelpris Hotel samlet daglig gennemsnitspris på hotellet samlet daglig værelsespris OPRET TABEL ##temp_result( hotel_id INT, hotel_name varchar(255), [dato] DATO, room_id INT, room_name VARCHAR (255), room_num INT, værelsespris DECIMAL, dsumpris DECIMAL, davgprice DECIMAL, Sumpric DECIMAL, SUMAVGPRIC DECIMAL
)
ERKLÆRE @hid INT; -- Hotel-ID ERKLÆR @infoid INT; -- info id --bekræfte, at markøren er en samling DEKLAR my_cursor markør for (SELECT hotel_id fra ##temp_hotel); --Åbn markøren-- Åbn my_cursor --Start Loop Cursor Variable-- hent næste fra my_cursor ind i @hid mens @@FETCH_STATUS = 0 -- returnerer tilstanden for den sidste markør, der blev udført af FETCH-sætningen -- BEGYND -- Baseret på hotellets ID er den tilbagevendende dato prissat IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_room') og type='U') BEGYND Drop table ##temp_room SLUT
-- Hoteller, efter dato, med værelser sorteret efter dato Pris VÆLG info_id, [dato], pris, forbliv, room_id IND I ##temp_room FRA dbo.room_info HVOR @sdate <= [dato] og [dato] <= @edate OG FORBLIV > 0 OG room_id I (VÆLG rt.room_id FRA dbo.room_type rt HVOR rt.hotel_id=@hid) ORDEN EFTER [dato] ASC, pris ASC
OPLYS @thisrdate DATO = NULL; -- Date DEKLAR @thisrnum INT=0; -- Antal værelser valgt på den aktuelle dato
ERKLÆRE @rdate DATO = NULL; -- Date DEKLAR @rmnum INT = 0; -- Antal værelser efter rumtype
-- Cyklus efter dato DEKLAR @my_cursor2 MARKØR; sæt @my_cursor2 = MARKØR FOR VÆLG info_id FRA ##temp_room ORDEN EFTER [dato] ASC, pris ASC ÅBN @my_cursor2; HENT NÆSTE FRA @my_cursor2 TIL @infoid WHILE(@@FETCH_STATUS=0) BEGYND --##temp_result VÆLG @rmnum=forbliv, @rdate=[dato] FRA ##temp_room HVOR info_id=@infoid HVIS (@thisrdate ER NULL ELLER @thisrdate != @rdate) BEGYND PRINT @rdate SÆT @thisrdate = @rdate; SÆT @thisrnum = 0; SLUT -- Doseringsformudvælgelsesrumtype HVIS(@thisrnum <= @roomnum) BEGYND HVIS (@thisrnum + @rmnum > @roomnum) BEGYND -- Antallet af værelser, du skal bruge SÆT @rmnum = @roomnum-@thisrnum; SLUT SLUT ELSE BEGYND -- Der kræves ikke plads til den dato SÆT @rmnum = 0; SLUT
HVIS (@rmnum > 0) BEGYND -- Tilføj resultater efter angivet antal INDSÆT I ##temp_result(hotel_id, hotel_name, [dato], room_id, room_name, room_num, roomprice, dsumprice, davgprice, sumpric, sumavgpric) VÆLG @hid, '', @thisrdate, room_id, '', @rmnum, pris, 0, 0, 0, 0 FRA ##temp_room HVOR info_id = @infoid
-- Antallet af værelser har nået den beregnede gennemsnitspris SÆT @thisrnum = @thisrnum + @rmnum; HVIS (@thisrnum = @roomnum) BEGYND -- Samlet pris pr. hotel, beregnet for datoer OPDATERING ##temp_result SÆT dsumprice=(VÆLG 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 den gennemsnitlige værelsespris pr. hotel, total pris pr. dato OPDATERING ##temp_result SÆT davgprice=(dsumprice/@roomnum) HVOR hotel_id=@hid OG [date]=@thisrdate SLUT SLUT
HENT NÆSTE FRA @my_cursor2 TIL @infoid; SLUT tæt @my_cursor2; --Sluk for markøren Udnyt @my_cursor2; --frigivelsesmarkør
-- Efter hotel, beregn den samlede hotelpris OPDATERING ##temp_result SÆT sumpric=(VÆLG SUM(room_num*roomprice) FRA ##temp_result tr HVOR tr.hotel_id=@hid) HVOR hotel_id=@hid -- Beregn den gennemsnitlige daglige pris for det samlede værelse på hotellet OPDATERING ##temp_result SÆT sumavgpric=(sumpric/@roomnum/@days) HVOR hotel_id=@hid
HENT næste fra my_cursor ind i @hid – gå til næste cursor, ingen deadloops SLUT Luk my_cursor – luk markøren Placer my_cursor - frigiv markøren
-- Tilføj hotellets navn og værelsestypen til den midlertidige tabel OPDATERING ##temp_result SÆT hotel_name=(VÆLG ht.hotel_name FRA dbo.hotel ht hvor ht.hotel_id=##temp_result.hotel_id), room_name=(VÆLG rt.room_name FRA dbo.room_type RT HVOR rt.room_id=##temp_result.room_id)
-- Tjek resultaterne fra resultattabellen VÆLG * FRA ##temp_result
-- Stop oprydning af midlertidige tabeller IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_hotel') og type='U') BEGYND Drop-tabel ##temp_hotel SLUT IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_room') og type='U') BEGYND Drop table ##temp_room SLUT IF EXISTS(vælg * fra tempdb.dbo.sysobjects hvor id = object_id(N'tempdb.. ##temp_result') og type='U') BEGYND Drop-bord ##temp_result SLUT
|