Ezt a bejegyzést utoljára Miaolinsen szerkesztette: 2018-12-6, 17:03
Nem a mysql-lel csináltam, hanem mssql-lel:
/* Határozd meg az időintervallit és a foglalandó szobák számát, kérdezze le a szállodákat, szobatípusokat és az átlagos árakat, amelyek megfelelnek a feltételeknek (idő, maradék szobák száma), és válogatd be az átlagos árakat a legalacsonyabbtól a legmagasabbig. Az eredmények tartalmazzák a szállodákat, a kiválasztott szobakombinációkat és mennyiségeket, valamint a legalacsonyabb átlagos árat. ##不要求为同一房型, de biztosan ugyanaz a hotel, és a szobatípust is félúton lehet megváltoztatni. -- Elemzés: Ez azt jelenti, hogy nincs szükség a szobatípusra való figyelembe, csak a szobák számát veszik figyelemre ##比如, válaszd ki a bejelentkezési időpontot 2018-11-14~2018-11-15, és a foglalt szobák száma 5 -- Elemzés: A szállodának a dátumtartományban kell lennie, és minden nap igény van a szobák számára (ha egy adott napon nincs senki, az nem felel meg a szabványnak) ##返回选择酒店A, 11-14 válassz 4 szobatípust 3-as azonosítóval, 1 szobatípust 2-es azonosítóval, 11-15 3-as szobatípust 3-as azonosítóval, 2 szobatípust 2-es azonosítóval, és a legalacsonyabb ár 2000 -- Elemzés: Az átlagos árat a napi minimum konfiguráció alapján számoljuk ki ##老师要求只能用sql语句, MySQL implementáció, nem tudja használni a pythont, c++-t stb. */
-- Bejövő paraméterek dátumtartománya, szükséges szobák száma DEKLARARE @sdate DÁTUM = '2018-11-14'; DEKLARARE @edate DÁTUM = '2018-11-15'; DEKLARARE @roomnum INT = 5;
-- Számold ki a tartózkodási napok számát DEKLARARE @days INT; HALMAZ: @days = DATEDIFF(NAP, @sdate, @edate)+1;
-- A szálloda száma, amely megfelel a dátumtartománynak, szoba száma IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_hotel') és type='U') KEZDJÜK Dobóasztal ##temp_hotel VÉGE
VÁLASZD ta.hotel_id A ##temp_hotel-BE INNEN. (SELECT ri. [dátum], rt.hotel_id, SUM(ri.marad) room_num room_info RI BAL OLDALRÓL CSATLAKOZNAK room_type rt ri.room_id=rt.room_id AHOL @sdate <= [dátum] és [dátum] <= @edate CSOPORTOT RI-BEN. [date],rt.hotel_id HAVING SUM(REMAIN) >= 5) ta CSOPORTOSÍTSUNK ta.hotel_id COUNT(*) = @days
-- A szálloda szerint számítva (napi minimum szobatípus beállítása)
IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_result') és type='U') KEZDJÜK Dobd le az asztalt ##temp_result VÉGE -- Ideiglenes eredmények táblázata Hotel dátum szoba típusa azonosító szoba típus név szoba száma szobaár szálloda napi összesen hotel napi átlagos szállodaár hotel összesített ár hotel összesen a szálloda ára hotel összesen napi átlagos ára a szálloda összes napi szobaára KÉSZÍTSD TÁBLÁZATOT ##temp_result( hotel_id INT, hotel_name Varchar(255), [dátum] DÁTUM, room_id INT, room_name VARCHAR(255), room_num INT, szobaár DECIMÁLIS, dsumprice DECIMÁLIS, davgprice DECIMÁLIS, sumpric DECIMAL, sumavgpric DECIMÁLIS
)
DECLARARE @hid INT; -- Hotel igazolvás DEKLARARE @infoid INT; -- info ID --megerősíteni, hogy a kurzor egy gyűjtemény DECLARE my_cursor kurzort (SELECT hotel_id ##temp_hotel-ból); --Nyisd ki a kurzort-- Nyisd my_cursor --Start Loop kurzor változók-- Hozd következő my_cursor-ből @hid míg @@FETCH_STATUS = 0 -- adja vissza az utolsó kurzor állapotát, amelyet a FETCH utasítás hajt végre -- KEZDJÜK -- A szállodai azonosító alapján az ismétlődő dátum megvan az árat IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_room') és type='U') KEZDJÜK Dobd le az asztalt ##temp_room VÉGE
-- Szállodák, dátum szerint, szobák dátum szerint rendezve Árfolyam VÁLASZD info_id, [dátum], ár, marad, room_id BE A ##temp_room A dbo.room_info-BÓL, AHOL @sdate <= [dátum] és [dátum] <= @edate ÉS MARADJ > 0 ÉS room_id IN (VÁLASSZ rt.room_id A dbo.room_type RT, AHOL rt.hotel_id=@hid) RENDELÉS [dátum] ASC, ár ASC
DEKLARARE @thisrdate DATE = NULL; -- Dátum DEKLARARE @thisrnum INT=0; -- A jelenlegi időpontban kiválasztott szobák száma
DEKLARARE @rdate DATE = NULL; -- Dátum DEKLARARE @rmnum INT = 0; -- A szobák száma szobatípus szerint
-- Dátum szerinti ciklus DECKARE @my_cursor2 KURZOR; Állítsd @my_cursor2 = KURZORT A KIVÁLASZTOTT info_id A ##temp_room RENDELÉS [DÁTUM] SZERINT ASC, ÁR ASC NYISD @my_cursor2; HOZD KÖVETKEZŐ @my_cursor2 BE @infoid WHILE(@@FETCH_STATUS=0) KEZDJÜK --##temp_result VÁLASZD @rmnum=marad, @rdate=[dátum] A ##temp_room-TŐL, AHOL info_id=@infoid HA (@thisrdate NULL VAGY @thisrdate != @rdate) KEZDJÜK NYOMTATJA @rdate SET @thisrdate = @rdate; HALMAZ: @thisrnum = 0; VÉGE -- Adagolási űrlap kiválasztó szoba típusa HA(@thisrnum <= @roomnum) KEZDJÜK IF (@thisrnum + @rmnum > @roomnum) KEZDJÜK -- Hány szobát kell használni SET @rmnum = @roomnum-@thisrnum; VÉGE VÉGE MÁS KEZDJÜK -- Ehhez a dátumhoz nincs szükség helyre HALMAZ: @rmnum = 0; VÉGE
IF (@rmnum > 0) KEZDJÜK -- Eredmények hozzáadása meghatározott szám szerint BEKERÜLJ ##temp_result(hotel_id, hotel_name, [dátum], room_id, room_name, room_num, szobaár, dsumprice, davgprice, sumpric, sumavgpric) VÁLASZD @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 A ###temp_room AHOL info_id = @infoid
-- A szobák száma elérte a számított átlagárat HALMAZ: @thisrnum = @thisrnum + @rmnum; IF (@thisrnum = @roomnum) KEZDJÜK -- Teljes ár szállodánként, dátumokra számítva FRISSÍTÉS ##temp_result ÁLLÍTSD BE DSUMPRICE=(SELECT SUM(room_num*roomprice) FROM ##temp_result TR, AHOL tr.hotel_id=@hid ÉS TR.[ date]=@thisrdate) AHOL hotel_id=@hid ÉS [dátum]=@thisrdate -- Számold ki az átlagos szobaárat szállodák szerint, az összárat dátum szerint FRISSÍTÉS ##temp_result ÁLLÍTSA DAVGPRICE=(dsumprice/@roomnum) AHOL hotel_id=@hid ÉS [dátum]=@thisrdate VÉGE VÉGE
KÖVETKEZŐ A @my_cursor2 A @infoid-BE; VÉGE közel @my_cursor2; --Kapcsold ki a kurzort Deallocate @my_cursor2; --szabadon engedje ki a kurzort
-- Hotelként számold ki a teljes szállodaárat FRISSÍTÉS ##temp_result ÁLLÍTSD SUMPRIC=(SELECT SUM(room_num*roomprice) FROM ##temp_result TR WHERE tr.hotel_id=@hid) AHOL hotel_id=@hid -- Számold ki a hotel teljes szobájának átlagos napi árát FRISSÍTÉS ##temp_result ÁLLÍTSA be sumavgpric=(sumpric/@roomnum/@days) AHOL hotel_id=@hid
HOZD a következő my_cursor-ből @hid-be – menj a következő kurzorhoz, nincs deadloop. VÉGE Zárd my_cursor – zárd le a kurzort Deallocate my_cursor - engedd el a kurzort
-- Hozzáadjuk a szálloda nevét és szobatípusának nevét az ideiglenes asztalhoz FRISSÍTÉS ##temp_result ÁLLÍTSD hotel_name=(VÁLASZD ht.hotel_name From dbo.hotel ht WHERE ht.hotel_id=##temp_result.hotel_id), room_name=(VÁLASSZ rt.room_name dbo.room_type RT-BŐL, AHOL rt.room_id=##temp_result.room_id)
-- Nézd meg az eredményeket az eredménytáblázatból VÁLASSZ * A ## KÖZÜL temp_result
-- Ideiglenes táblák tisztításának vége IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_hotel') és type='U') KEZDJÜK Dobóasztal ##temp_hotel VÉGE IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_room') és type='U') KEZDJÜK Dobd le az asztalt ##temp_room VÉGE IF LÉTEZIK(válassz * a tempdb.dbo.sysobjects között, ahol id = object_id(N'tempdb.. ##temp_result') és type='U') KEZDJÜK Dobd le az asztalt ##temp_result VÉGE
|