Detta inlägg redigerades senast av Miaolinsen den 6-12-2018 kl. 17:03
Jag gjorde det inte med MySQL, jag gjorde det med mssql:
/* Ange tidsintervall och antal rum som ska bokas, fråga efter hotell, rumstyper och deras genomsnittliga priser som uppfyller villkoren (tid, antal rum kvar), och sortera dem efter genomsnittspris från lägst till högst. Resultaten inkluderar hotell, utvalda rumskombinationer och kvantiteter samt det lägsta genomsnittspriset. ##不要求为同一房型, men det måste vara samma hotell, och du kan ändra rumstyp halvvägs. -- Parsing: Det betyder att det inte finns något behov av att ta hänsyn till rumstypen, endast antalet rum räknas ##比如, välj incheckningstiden 2018-11-14~2018-11-15, och antalet bokade rum är 5 -- Analys: Hotellet måste ligga inom datumintervallet, och det finns en efterfrågan på antalet rum varje dag (om det inte finns någon en viss dag kommer det inte att uppfylla standarden) ##返回选择酒店A, 11-14 välj 4 rumstyper med ID 3, 1 rumstyp med ID 2, 11-15 välj 3 rumstyper med ID 3, 2 rumstyper med ID 2, och lägsta priset är 2000 -- Analys: Beräkna genomsnittspriset enligt minsta konfiguration per dag ##老师要求只能用sql语句, MySQL-implementation, kan inte använda Python, C++, etc. */
-- Inkommande parametrar, datumintervall, antal rum som krävs DEKLARERA @sdate DATUM = '2018-11-14'; DEKLARERA @edate DATUM = '2018-11-15'; DEKLARERA @roomnum INT = 5;
-- Beräkna antalet dagar av vistelse DEKLAR @days INT; SET @days = DATEDIFF(DAY, @sdate, @edate)+1;
-- Hotellnummer som uppfyller datumintervallet, antal rum IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_hotel') och typ='U') BÖRJA Släppbord ##temp_hotel SLUT
VÄLJ ta.hotel_id i ##temp_hotel FRÅN (VÄLJ ri. [datum], rt.hotel_id, SUM(ri.remain) room_num FRÅN room_info ri VÄNSTER ANSLUTA room_type rt på ri.room_id=rt.room_id där @sdate <= [datum] och [datum] <= @edate GRUPP EFTER ri. [datum],rt.hotel_id SOM HAR SUMMA(ÅTERSTÅENDE) >= 5) ta GRUPPERA EFTER ta.hotel_id HA RÄKNING(*) = @days
-- Beräknat enligt hotellet (konfigurera minsta rumstyp per dag)
IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_result') och skriv='U') BÖRJA Släppbord ##temp_result SLUT -- Preliminär resultattabell Hotelldatum Rumstyp ID Rumstyp Namn Antal rum Hotell Dagligt totalt hotell Dagligt genomsnittligt hotellpris Hotell totalt hotellpris Totalt Dagligt genomsnittspris på hotell Totalt dagligt genomsnittspris på hotell Totalt dagligt rumspris SKAPA TABELL ##temp_result( hotel_id INT, hotel_name varchar(255), [datum] DATUM, room_id INT, room_name VARCHAR (255), room_num INT, rumspris DECIMAL, dsumpris DECIMAL, davgprice DECIMAL, SUMPRISK DECIMAL, SUMAVGPRIC DECIMAL
)
DEKLARERA @hid INT; -- Hotell-ID DEKLARERA @infoid INT; -- info-id --bekräfta att markören är en samling DEKLARERA my_cursor markör för (SELECT hotel_id från ##temp_hotel); --Öppna markören-- öppna my_cursor --Startloop-markörvariabler-- hämta nästa från my_cursor till @hid medan @@FETCH_STATUS = 0 -- returnerar tillståndet för den senaste markören som utfördes av FETCH-satsen -- BÖRJA -- Baserat på hotell-ID är det återkommande datumet prissatt IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_room') och typ='U') BÖRJA Släppbord ##temp_room SLUT
-- Hotell, efter datum, med rum sorterade efter datum Pris VÄLJ info_id, [datum], pris, rest, room_id IN I ##temp_room FRÅN dbo.room_info DÄR @sdate <= [datum] och [datum] <= @edate OCH FÖRBLI > 0 OCH room_id I (VÄLJ rt.room_id FRÅN dbo.room_type rt DÄR rt.hotel_id=@hid) ORDNA EFTER [datum] ASC, pris ASC
DEKLARERA @thisrdate DATUM = NULL; -- Datum DEKLARERA @thisrnum INT=0; -- Antal rum valda på det aktuella datumet
DEKLARERA @rdate DATUM = NULL; -- Datum DEKLARERA @rmnum INT = 0; -- Antal rum efter rumstyp
-- Cykel efter datum DEKLAR @my_cursor2 MARKÖR; Ställ @my_cursor2 = MARKÖR FÖR ATT VÄLJA info_id FRÅN ##temp_room ORDNA EFTER [datum] ASC, pris ASC ÖPPNA @my_cursor2; HÄMTA NÄSTA FRÅN @my_cursor2 TILL @infoid WHILE(@@FETCH_STATUS=0) BÖRJA --##temp_result VÄLJ @rmnum=förbli, @rdate=[datum] FRÅN ##temp_room DÄR info_id=@infoid OM (@thisrdate ÄR NULL ELLER @thisrdate != @rdate) BÖRJA TRYCK @rdate SET @thisrdate = @rdate; SET @thisrnum = 0; SLUT -- Typ av doseringsformulär i rummet IF(@thisrnum <= @roomnum) BÖRJA OM (@thisrnum + @rmnum > @roomnum) BÖRJA -- Antalet rum du behöver använda SET @rmnum = @roomnum-@thisrnum; SLUT SLUT ANNARS BÖRJA -- Inget rum behövs för det datumet SET @rmnum = 0; SLUT
OM (@rmnum > 0) BÖRJA -- Lägg till resultat med angivet antal INFOGA I ##temp_result(hotel_id, hotel_name, [datum], room_id, room_name, room_num, rumpris, dsumprice, davgprice, sumpric, sumavgpric) VÄLJ @hid, '', @thisrdate, room_id, '', @rmnum, pris, 0, 0, 0, 0 FRÅN ##temp_room DÄR info_id = @infoid
-- Antalet rum har nått det beräknade genomsnittspriset SET @thisrnum = @thisrnum + @rmnum; OM (@thisrnum = @roomnum) BÖRJA -- Totalpris per hotell, beräknat för datum UPPDATERING ##temp_result SÄTT dsumprice=(VÄLJ SUM(room_num*roomprice) FRÅN ##temp_result tr DÄR tr.hotel_id=@hid OCH tr.[ datum]=@thisrdate) DÄR hotel_id=@hid OCH [datum]=@thisrdate -- Beräkna genomsnittligt rumspris per hotell, totalt pris per datum UPPDATERING ##temp_result SÄTT davgprice=(dsumprice/@roomnum) DÄR hotel_id=@hid OCH [datum]=@thisrdate SLUT SLUT
HÄMTA NÄSTA FRÅN @my_cursor2 TILL @infoid; SLUT Nära @my_cursor2; --Stäng av markören Dela ut @my_cursor2; --frigivningsmarkör
-- Per hotell, beräkna det totala hotellpriset UPPDATERING ##temp_result SÄTT sumpric=(VÄLJ SUM(room_num*roomprice) FRÅN ##temp_result tr DÄR tr.hotel_id=@hid) DÄR hotel_id=@hid -- Beräkna det genomsnittliga dagliga priset för det totala rummet på hotellet UPPDATERING ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) DÄR hotel_id=@hid
HÄMTA nästa från my_cursor till @hid – gå till nästa markör, inga deadloops SLUT Stäng my_cursor – stäng markören Dela plats my_cursor – släpp markören
-- Lägg till hotellnamnet och rumstypsnamnet i den tillfälliga tabellen UPPDATERING ##temp_result STÄLL hotel_name=(VÄLJ ht.hotel_name FRÅN dbo.hotel ht DÄR ht.hotel_id=##temp_result.hotel_id), room_name=(VÄLJ rt.room_name FRÅN dbo.room_type RT DÄR rt.room_id=##temp_result.room_id)
-- Kontrollera resultaten från resultattabellen VÄLJ * FRÅN ##temp_result
-- Avsluta rensningen av tillfälliga tabeller IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_hotel') och typ='U') BÖRJA Släppbord ##temp_hotel SLUT IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_room') och typ='U') BÖRJA Släppbord ##temp_room SLUT IF EXISTS(välj * från tempdb.dbo.sysobjects där id = object_id(N'tempdb.. ##temp_result') och skriv='U') BÖRJA Släppbord ##temp_result SLUT
|